這篇東西主要是爲了瞭解C#中使用派生類更改基類的數據和行爲,C#提供兩種方法:一是使用new的派生成員替換基成員;二是重寫虛擬的基成員(Override和Virtual)。還有介紹實現了類的接口強制轉換爲接口的時候,轉換後仍是能調用類中定義好的接口。直接看代碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace test6
{
class Program
{
static void Main(string[] args)
{
B b = new B();
A a = new A();
//在1和2,因爲B類只是用了new來替換A類中的AA()方法,這種方式不是繼
//承多態性,b在強制轉化爲A類時調用AA(),是調用基類A的方法,而不是
//b用new替換A類中的AA()方法。
//而3和4,用的是virtual和override來實現繼承多態性,因此這種方式既
//使把b強制轉化爲A類時調用AA(),也是b類中覆蓋的AA()方法
Console.WriteLine("直接從B類中調用b.AA():");//1
b.AA();
Console.WriteLine("直接從B類中調用((A)b).AA():");//2
((A)b).AA();
Console.WriteLine("直接從B類中調用b.AAA():");//3
b.AAA();
Console.WriteLine("直接從B類中調用((A)b).AAA():");//4
((A)b).AAA();
//這個說明類即便是強制轉化了接口也不會掉失實現接口內容。
//如:A類中實現了接口A並要輸出必定的內容,可是繼承A類的B類轉換爲接口
//Inter的時候,仍是能實現A類定義了接口Inter中的內容,即((Inter)b).InterA()。
Console.WriteLine("直接從B類中調用b.InterA():");
b.InterA();
Console.WriteLine("直接從B類中調用((Inter)b).InterA():");
((Inter)b).InterA();
Console.WriteLine("結束.....");
Console.ReadKey();
}
}
interface Inter
{
void InterA();
}
class A : Inter
{
public A()
{
}
public void AA()
{
Console.WriteLine("我是基類A的AA()方法\n");
}
public virtual void AAA()
{
Console.WriteLine("我是基類A的AAA()方法,實現了Virtual\n");
}
public void InterA()
{
Console.WriteLine("我是基類A,實現了接口Inter\n");
}
}
class B : A
{
public B()
{
}
public new void AA()
{
Console.WriteLine("我是B類中用new來替換基類的AA()方法,但這不是繼承的多態性\n");
}
public override void AAA()
{
Console.WriteLine("我是B類中用override來替換基類的AAA()方法,這是繼承的多態性\n");
}
}
}