C#中繼承和多型的研究
通常繼承
在這個部分,我將構建兩個類
A
和B
,B
是A
的子類。
namespace CSharpPolymorphism {
class A {
public string value = "A";
public string Say() { return "I`m A, My Value: " + value; }
}
class B : A {
public string value = "B";
public string Say() { return "I`m B, My Value: " + value; }
}
class Program {
static void Main(string[] args) {
A Aa = new A();
B Bb = new B();
A Ab = new B();
Console.WriteLine(Aa.Say() + ", Got Value: " + Aa.value);
Console.WriteLine(Bb.Say() + ", Got Value: " + Bb.value);
Console.WriteLine(Ab.Say() + ", Got Value: " + Ab.value);
// Pause
Console.ReadLine();
}
}
}
執行結果為:
// I`m A, My Value: A, Got Value: A
// I`m B, My Value: B, Got Value: B
// I`m A, My Value: A, Got Value: A
-
結果說明: I`m N 表示呼叫了N的方法, My Value: N 表示方法內部獲取到的值, Got Value: N 表示從外部直接訪問物件屬性得到的值。
由此可見,通常繼承中,若使用子類來例項化父類物件,不論從類的內部還是外部訪問這個物件,這個物件都會使用父類的屬性和方法。
父類定義虛方法,子類新建方法
在這個部分,我將構建兩個類
A
和B
,B
是A
的子類。A
中的方法定義為virtual
虛方法,B
中方法定義為new
新建方法。
namespace CSharpPolymorphism {
class A {
public string value = "A";
public virtual string Say() { return "I`m A, My Value: " + value; }
}
class B : A {
public string value = "B";
public new string Say() { return "I`m B, My Value: " + value; }
}
class Program {
static void Main(string[] args) {
A Aa = new A();
B Bb = new B();
A Ab = new B();
Console.WriteLine(Aa.Say() + ", Got Value: " + Aa.value);
Console.WriteLine(Bb.Say() + ", Got Value: " + Bb.value);
Console.WriteLine(Ab.Say() + ", Got Value: " + Ab.value);
// Pause
Console.ReadLine();
}
}
}
執行結果為:
// I`m A, My Value: A, Got Value: A
// I`m B, My Value: B, Got Value: B
// I`m A, My Value: A, Got Value: A
與前面的例子結果一樣,當子類新建父類的虛方法時,若使用子類來例項化父類物件,不論從類的內部還是外部訪問這個物件,這個物件都會使用父類的屬性和方法。
父類定義虛方法,子類覆蓋方法
在這個部分,我將構建兩個類
A
和B
,B
是A
的子類。A
中的方法定義為virtual
虛方法,B
中方法定義為override
覆蓋方法。
namespace CSharpPolymorphism {
class A {
public string value = "A";
public virtual string Say() { return "I`m A, My Value: " + value; }
}
class B : A {
public string value = "B";
public override string Say() { return "I`m B, My Value: " + value; }
}
class Program {
static void Main(string[] args) {
A Aa = new A();
B Bb = new B();
A Ab = new B();
Console.WriteLine(Aa.Say() + ", Got Value: " + Aa.value);
Console.WriteLine(Bb.Say() + ", Got Value: " + Bb.value);
Console.WriteLine(Ab.Say() + ", Got Value: " + Ab.value);
// Pause
Console.ReadLine();
}
}
}
執行結果為:
// I`m A, My Value: A, Got Value: A
// I`m B, My Value: B, Got Value: B
// I`m B, My Value: B, Got Value: A
在這個例子中,若使用子類來例項化父類物件,會呼叫子類的方法,而且在方法中獲取的屬性值是子類的,但是從外部直接訪問這個物件的屬性時,會使用父類物件的屬性值。