Questions

  1. What is the keyword used to call the constructor from the base class?

    • this.
    • the name of the base class.
    • base
    • over
    • inherits
  2. Suppose your are given an ElectricDevice class and a WallDecor class. You would like to write a Clock class that represents at the same time an electric device and a wall decor. This is possible only if the ElectricDevice and WallDecor classes are…

    • Sealed
    • Interfaces
    • Protected
    • Constructors
  3. A method with header public virtual void Test(int a, out int b) will…

    • Return a value
    • Set the value of b
    • Require two arguments
    • Be overrideable
  4. A method with header public abstract string Test() will…

    • Have an empty body
    • Need to be inside an abstract class
    • Not be overriden

Problems

  1. Consider the diagram representing the “Room”, “ClassRoom”, “Office” classes and their relations.
A UML diagram for the Room ⇽ ClassRoom class (text version, image version, svg version)

Suppose you are given an implementation of the Room class, such that

    Room test = new Room("UH", 243);
    Console.WriteLine(test);

displays

UH 243
  1. Write an implementation of the ClassRoom class. Your ToString method should display the room’s building and number, in addition to whether it has AV set-up.

    Solution

    class ClassRoom : Room
    {
      private bool av;
     
      public ClassRoom(string bP, int nP, bool aP)
        : base(bP, nP)
      {
        av = aP;
      }
     
      public override string ToString()
      {
        return base.ToString() + "av? " + av;
      }
    }
  2. Write a SameBuilding static method to be placed inside the Room class such that

    Office test1 = new Office("UH", 127, "706 737 1566");
    ClassRoom test2 = new ClassRoom("UH", 243, true);
    Office test3 = new Office("AH", 122, "706 729 2416");
    Console.WriteLine(Room.SameBuilding(test1, test2));
    Console.WriteLine(Room.SameBuilding(test2, test3));

    Would display “true” and “false”.

    Solution

      public static bool SameBuilding(Room a, Room b)
      {
        return a.building == b.building;
      }
  3. Consider the diagram representing the “Room”, “BedRoom”, “BathRoom” classes and their relations.

    A UML diagram for the Room ⇽ BedRoom class (text version, image version, svg version)
    1. Write an implementation of the SurfaceArea property for the Room class, assuming you are given an implementation of the Width and Length properties.

      Solution

        public double SurfaceArea
        {
          get { return Width * Length; }
        }

      (Download this code)

    2. Check the statements that would compile, assuming that rTest is a Room object, beTest is a BedRoom object, and baTest is a BathRoom object.

      • rTest.Capacity = 12;
      • baTest.Width = 12;
      • beTest.capacity = 3;
      • rTest.SurfaceArea = -2;
      • baTest.Capacity = 3;
      • beTest.Shower = true;
      • Console.WriteLine(baTest.ToString());
    3. Write a complete implementation of the BedRoom class.

      • Your Capacity property should use the capacity attribute, and throw an exception if the argument given is strictly less than 1.
      • Your ToString method should complement the Room’s ToString by appending to its string the capacity (in person) of the BedRoom object.

      Solution

      using System;
       
      class BedRoom : Room
      {
        private int capacity;
        public int Capacity
        {
          set
          {
            if (value < 0)
            {
              throw new ArgumentException(
                "A capacity must be positive or 0."
              );
            }
            else
            {
              capacity = value;
            }
          }
        }
       
        public BedRoom(double wP, double lP, int cP)
          : base(wP, lP)
        {
          Capacity = cP;
        }
       
        public override string ToString()
        {
          return base.ToString() + "Capacity: " + capacity;
        }
      }

      (Download this code)

    4. Write the ToString method of the BathRoom class, knowing that a disclaimer should be part of the string returned if the BathRoom has a shower or a bathtub but no hot water.

      Solution

        public override string ToString()
        {
          string equipement = "";
          if (Shower)
          {
            equipement += "a shower";
          }
          if (Shower && Bathtub)
          {
            equipement += " and ";
          }
          if (Bathtub)
          {
            equipement += "a bathtub";
          }
          if (!Shower && !Bathtub)
            equipement += "no shower nor bathtub";
          equipement += ".";
          if (!hotWater && (Shower || Bathtub))
          {
            equipement += " However, it does not have hot water";
          }
       
          return base.ToString()
            + "\nThis bathtub has "
            + equipement;
        }

      (Download this code)

  4. Consider the diagram representing the “Article”, “Book” classes and their relations.

    A UML diagram for the Article ⇽ Book class (text version, image version, svg version)
    1. Write a (partial) implementation of the Article abstract class:

      1. Write an implementation for the price attribute: you can either use a getter and a setter (as pictured in the UML diagram), or a property. However, in both cases, setting the price to a negative value should result in an ArgumentOutOfRangeException exception being thrown.
      2. Write an abstract ShippingCosts() method.

      Solution

      using System;
       
      abstract class Article
      {
        public string Id { get; set; }
        private decimal price;
       
        public void SetPrice(decimal priceP)
        {
          if (priceP < 0)
          {
            throw new ArgumentOutOfRangeException();
          }
          else
          {
            price = priceP;
          }
        }
       
        public decimal GetPrice()
        {
          return price;
        }
       
        public Article(string idP, decimal priceP)
        {
          Id = idP;
          SetPrice(priceP);
        }
       
        public abstract decimal ShippingCosts();
      }
    2. Now, assume given a complete implementation of the Article abstract class. Write a complete implementation of the Book class (header included), containing:

      1. An implementation of the Title property using auto-properties.
      2. A Book constructor that passes the idP and priceP arguments to the Article constructor. The titleP argument should be assigned to the Title property.
      3. A ShippingCosts() method that returns either 5.0, or 10% of the Book’s price, whichever is smallest.

      Solution

      class Book : Article
      {
        public string Title { get; set; }
       
        public Book(string idP, decimal priceP, string titleP)
          : base(idP, priceP)
        {
          Title = titleP;
        }
       
        public override decimal ShippingCosts()
        {
          decimal tenp = .1M * GetPrice();
          if (tenp > 5M)
          {
            tenp = 5M;
          }
          return tenp;
        }
      }
    3. Write statements that, if placed in a Main method, would

      1. Create a Book with Id “AAA001”, price $12.5, titled “What it’s like to be a bird”.
      2. Display (nicely) its shipping costs.
      3. Display its Id (as retrieved from the object).

      Solution

      using System;
       
      class Program
      {
        public static void Main()
        {
          Book test = new Book(
            "AAA001",
            12.5M,
            "What it's like to be a bird."
          );
          Console.WriteLine($"{test.ShippingCosts():C}");
          Console.WriteLine(test.Id);
        }
      }

      (Download this code)