Inheritance means if class B inherits from class A then B has class A's attributes and behavior. That means class B inherits class A's members (fields, properties and methods).
We call the class A the base class or the parent class and the class B the derived class or the child class.
{
...
}
class B : A // class B inherits from class A.
{
...
}
As a result of inheritance, if class B inherits from class A then class B can substitute class A. This is because the inheritance relationship is an "is-a" relationship. The class B is an A.
But this is one-directional relation, class B is an A but class A is not a B.
B ref_b = new B();
ref_a = ref_b; // because B is an A so we can put a B instead of an A
//ref_b = ref_a ; // Error. This won't compile because an A is not a B (but a B is an A)
So, you might have a function that returns an A but it can return a B because B is an A. The same concept is applied if you have a function that takes an A as a parameter but you can pass a B instead.
Class hierarchy
A class hierarchy represents the sequence of inheritance of a class. Let's take a look at the System.Windows.Forms.Label's inheritance path in the following hierarchy.
System.Object
System.MarshalByRefObject
System.ComponentModel.Component
System.Windows.Forms.Control
System.Windows.Forms.Label
System.Windows.Forms.ButtonBase
System.Windows.Forms.Button
System.Windows.Forms.CheckBox
System.Windows.Forms.RadioButton
A Label is a Control and a Control is a Component, So a Label is a Component. You got the idea, a Label is a MarshalByRefObject and is an Object. All .Net classes implicitly inherits from the System.Object class
Polymorphism and Overriding
Polymorphism is the ability of objects of different classes to respond to method calls of the same signature, each one according to an appropriate class-specific behavior. This is often achieved by inheritance.
Overriding allows you to alter behaviors inherited from the parent of the class.
To override a function in the child class it must be "overridable" in the base class. It must be marked with the virtual keyword in the base class, in fact the equivalent Visual Basic keyword is actually Overridable which is more meaningful. Of course, an overridable function can not be private so that it's exposed to the child class. We shall discuss access modifiers later.
{
public virtual string Foo()
{
return "A's foo.";
}
...
}
class B : A
{
public override string Foo()
{
return "B's foo.";
}
...
}
B ref_b = new B();
ref_a = ref_b;
Console.WriteLine(ref_a.Foo()); // "B's foo."
To understand better the overriding behavior, we shall discuss the this keyword and base.
this vs. base
The this keyword represents the instance of the object being instantiated from the current class. Whether it's a base class or a derived class, it doesn't matter.
The base keyword represents the direct parent of the class which the object is being instantiated from.
So, you use the this keyword to explicitly reach the members of the same class, and you use the base keyword to explicitly reach the members of the parent of the class.
Let's get back to the previous code snippet and modify it a little bit to see what does it all mean.
{
public virtual string Foo()
{
return "A's foo.";
}
...
public void Poo1()
{
// Console.WriteLine(Foo()); // the same as the next line
Console.WriteLine(this.Foo()); // "A's foo."
}
}
class B : A
{
public override string Foo()
{
return "B's foo.";
}
...
public void Poo2()
{
Console.WriteLine(base.Foo()); // "A's foo."
// Console.WriteLine(Foo()); // the same as the next line
Console.WriteLine(this.Foo()); // "B's foo."
}
}
From the outside.
ref_a.Foo(); // "A's foo."
B ref_b = new B();
ref_b.Foo(); // "B's foo."
ref_a = ref_b;
ref_a.Foo(); // "B's foo." // it goes down the class hierarchy
Notice that at the previous line B's Foo is called instead of A's. That's because if a function is virtual and is called from a reference to the base (it's treated as the base). It goes down the class hierarchy whenever is possible. This will become clearer when discussing type casting.
http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming
