Csharp/CSharp Tutorial/Class/Derived Class
A base class reference can refer to a derived class object
<source lang="csharp">using System;
class BaseClass {
public int a; public BaseClass(int i) { a = i; }
}
class DerivedClass : BaseClass {
public int b; public DerivedClass(int i, int j) : base(j) { b = i; }
}
class MainClass {
public static void Main() { BaseClass x = new BaseClass(10); BaseClass x2; DerivedClass y = new DerivedClass(5, 6); x2 = x; // OK, both of same type Console.WriteLine("x2.a: " + x2.a); x2 = y; // Ok because DerivedClass is derived from BaseClass Console.WriteLine("x2.a: " + x2.a); // BaseClass references know only about BaseClass members x2.a = 19; // OK
// x2.b = 27; // Error, BaseClass doesn"t have a b member
}
}</source>
x2.a: 10 x2.a: 6
Illustrates member accessibility in subclass
<source lang="csharp">using System; public class Car {
private string make; protected string model; public Car(string make, string model) { this.make = make; this.model = model; } public virtual void Start() { startCar(); System.Console.WriteLine("Vehicle started"); } private void startCar() { System.Console.WriteLine("Turning starter motor..."); }
} public class MyFirstCar : Car {
public MyFirstCar(string make, string model) : base(make, model) { } public override void Start() { Console.WriteLine("Starting " + model); base.Start(); }
} class MainClass {
public static void Main() { MyFirstCar myCar = new MyFirstCar("Toyota", "MR2"); myCar.Start(); }
}</source>
Starting MR2 Turning starter motor... Vehicle started
Illustrates member hiding
<source lang="csharp">using System; public class BaseClass {
public string lastName; public string firstName; public BaseClass(string lastName, string firstName) { Console.WriteLine("In BaseClass constructor"); this.lastName = lastName; this.firstName = firstName; Console.WriteLine("this.lastName = " + this.lastName); Console.WriteLine("this.firstName = " + this.firstName); } public void DisplayfirstName() { Console.WriteLine("In BaseClass DisplayfirstName() method"); Console.WriteLine("firstName = " + firstName); }
} public class DerivedClass : BaseClass {
public new string firstName; public DerivedClass(string lastName, string firstName) : base(lastName, "Test") { Console.WriteLine("In DerivedClass constructor"); this.firstName = firstName; Console.WriteLine("this.firstName = " + this.firstName); } public new void DisplayfirstName() { Console.WriteLine("In DerivedClass DisplayfirstName() method"); Console.WriteLine("firstName = " + firstName); base.DisplayfirstName(); }
}
class MainClass {
public static void Main() { Console.WriteLine("Creating a DerivedClass object"); DerivedClass myDerivedClass = new DerivedClass("A", "B"); Console.WriteLine("Back in Main() method"); Console.WriteLine("myDerivedClass.lastName = " + myDerivedClass.lastName); Console.WriteLine("myDerivedClass.firstName = " + myDerivedClass.firstName); Console.WriteLine("Calling myDerivedClass.DisplayfirstName()"); myDerivedClass.DisplayfirstName(); }
}</source>
Creating a DerivedClass object In BaseClass constructor this.lastName = A this.firstName = Test In DerivedClass constructor this.firstName = B Back in Main() method myDerivedClass.lastName = A myDerivedClass.firstName = B Calling myDerivedClass.DisplayfirstName() In DerivedClass DisplayfirstName() method firstName = B In BaseClass DisplayfirstName() method firstName = Test