An example of accessing methods and properties of inherited classes using a reference to the base class
The example examines:
- ways to access instances of inherited classes using a reference to the base class;
- study of the features of the use of keywords is, as;
- methods for calling methods of the same name in the class hierarchy.
Contents
Search other websites:
Task
Declare the Figure class, which contains the name field defining the name of the figure. In the Figure class, declare the following methods:
- constructor with 1 parameter;
- Display() method to display the name of figure.
From the Figure class, inherit the Rectangle class (rectangle) with the following fields:
- coordinate of the upper left corner (x1; y1);
- coordinate of the lower right corner (x2; y2).
In the Rectangle class, implement the following methods and functions:
- a constructor with 5 parameters that calls the constructor of the base class Figure;
- a constructor without parameters to set the coordinates of the angles (0; 0), (1; 1) and call the constructor with 5 parameters using the this keyword;
- Display() method that displays the name of the figure and the value of the internal fields. This method refers to the base class method of the same name;
- method Area(), which returns the area of the rectangle.
From the Rectangle class, you need to inherit the RectangleColor class. In the RectangleColor class, implement the color field and the following methods:
- a constructor with 6 parameters, which calls the constructor of the base class Rectangle;
- constructor without parameters, which sets the coordinates (0; 0), (1; 1) and calls the constructor with 6 parameters using the this keyword;
- method Display() that displays the name of the figure and the values of the internal fields. This method refers to the base class method of the same name;
- method Area(), which returns the area of the rectangle. The method calls the Area() method of the base class.
In the Main() function, do the following:
-
- declare a reference to the base class Figure;
- create instances of the Rectangle and RectangleColor classes;
- demonstrate access to methods of derived classes by referencing the Figure class.
⇑
Instructions. Program text
Below is the solution of the problem. The program is implemented as a Console Application.
using System; using static System.Console; namespace ConsoleApp1 { // Class Figure class Figure { // protected field of class protected string name; // constructor with 1 parameter public Figure(string name) { this.name = name; } // Method Display() public void Display() { WriteLine("Figure.name = {0}", name); } } // Class Rectangle - inherits (extends) possibilities of class Figure class Rectangle : Figure { // Hidden fields - coordinates of fields protected double x1, y1, x2, y2; // Constructor with 5 parameters public Rectangle(string name, double x1, double y1, double x2, double y2) : base(name) // call the base class constructor { this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; } // Constructor without parameters, calls the constructor with 5 parameters public Rectangle() : this("Rectangle", 0, 0, 1, 1) { } // Method Display() - displays the values of the fields, // calls the base class method of the same name. // This method overrides the Diplay() method // of the base class Figure, so the new keyword is specified public new void Display() { base.Display(); // call the Display() method of the base class Write("Rectangle: x1 = {0:f2}, y1 = {1:f2}, ", x1, y2); WriteLine("x2 = {0:f2}, y2 = {1:f2}", x2, y2); } // Area of a rectangle public double Area() { return Math.Abs(x1 - x2) * Math.Abs(y1 - y2); } } // RectangleColor class - adds color to a rectangle, // inherits the capabilities of the Rectangle class class RectangleColor : Rectangle { // Hidden class field protected int color = 0; // Constructor with 6 parameters, // calls the Rectangle base class constructor public RectangleColor(string name, double x1, double x2, double y1, double y2, int color) : base(name, x1, y1, x2, y2) { this.color = color; } // Constructor without parameters, // calls the constructor with 6 parameters public RectangleColor() : this("RectangleColor", 0, 0, 1, 1, 0) { } // Method Display() - calls the method of the same name // of the base class, in order not to hide it, you need to use the new keyword public new void Display() { base.Display(); WriteLine("RectangleColor.color = {0}", color); } // The area of a rectangle public new double Area() { return base.Area(); // invoke the Area() method of the base class } } class Program { static void Main(string[] args) { // 1. Declare a reference to the base class Figure refFg; // 2. Create instances of classes Figure, Rectangle, Rectangle Figure objFg = new Figure("Figure"); Rectangle objRect = new Rectangle("Rectangle", 1, 2, 5, -4); RectangleColor objRectCol = new RectangleColor("RectangleColor", 1, 8, -1, 3, 2); // 3. Set refFg to the value of the objFg reference to the base class Figure refFg = objFg; refFg.Display(); // The Display() method of the Figure class is called. WriteLine("-----------------------"); // 4. Set refg to object refFg = objRect; // 4.1. The Display() method of the Figure class is called. refFg.Display(); WriteLine("-----------------------"); // 4.2. The Display() method of the Rectangle class is called - method 1 try { ((Rectangle)refFg).Display(); // explicit cast to Rectangle type WriteLine("-----------------------"); } catch { // if casting to the type did not work correctly, then exit WriteLine("Error."); return; } // 4.3. The Display() method of the Rectangle class is called - method 2. // This method uses the as keyword, which implements // an attempt to cast one type to another, // in our case Figure => Rectangle // declare an additional reference of Rectangle type Rectangle r = refFg as Rectangle; if (r != null) r.Display(); WriteLine("-----------------------"); // 4.4. Method Display() of class Rectangle is called - method 3. // The is keyword is used here to determine type compatibility, // the result of the check is the bool type. // If types can be cast, then true is returned, otherwise false. if (refFg is Rectangle) { (refFg as Rectangle).Display(); WriteLine("-----------------------"); } // 5. Declare a reference to the instance of RectangleColor class refFg = objRectCol; // 5.1. Call the Display() method of the base class Figure (rather than Rectangle) refFg.Display(); WriteLine("-----------------------"); // 5.2. Call the Display() method of the Rectangle class in one of the ways, // described in clauses 4.2 - 4.4. try { ((Rectangle)refFg).Display(); WriteLine("-----------------------"); } catch { WriteLine("Error."); return; } // 5.3. Call the Display() method of class RectangleColor in one of the ways, // described in clauses 4.2 - 4.4. if (refFg is RectangleColor) { (refFg as RectangleColor).Display(); WriteLine("-----------------------"); } } } }
⇑
Related topics
- Inheritance. Basic concepts. Advantages and disadvantages. General form. The simplest examples. Access modifier protected
- Features of using reference to the base class. Keywords as, is. Ways to call methods with the same name in inheritance hierarchies
⇑