在說繼承前我們來先看一段使用類的繼承性的代碼:
class A
{
public A()
{
Console.WriteLine("初始化A類");
}
public void prind()
{
Console.WriteLine("A");
}
}
class B:A
{
public B()
{
Console.WriteLine("初始化B類");
}
public void prind()
{
Console.WriteLine("B");
}
}
class C
{
static void Main(string []args)
{
B b=new B();
b.prind();
}
}
輸出結果:
初始化A類
初始化B類
B
下面我們來看看A、B、C三個類的對話:
C:A類你運行構造函數,B類你運行構造函數和prind()方法;
A:我為什麼要運行構造函數呢?你又沒有對我進行實例化;
C:因為B類繼承了你,所以你是B類的基類,B類是你的子類;基於基類在子類初始化實例前自動進行初始化的實例,所以你要運行構造函數。
B:雖然我你對我進行了實例化,但我是繼承了A類啊,所以不應該運行我的prind()方法啊?應該運行我的父類A的prind方法啊?
C:雖然你是繼承了A類,如果你沒有實現prind()方法確實是應該運行你的父類A的prind()方法;但你自己實現了prind()方法,所以應該運行你的prind()方法;就像是你繼承了你父親的公司,但又用你父親公司的名字新開了另一家公司,哪麼應該哪家公司是你的呢?這就是同樣的道理,你只是繼承了你父親的公司而已,也就是說你可以使用你父親的公司,但哪家公司不是你的,是你父親的,而你新開的哪家公司才是你的;所以是運行你的prind()方法。
B:哦,你說我可以使用我的父類的中的方法,哪我應該怎麼才能使用它呢?
C:很簡單,如果你沒有和父類有相同的方法,只要不是你父類自己私有的(private)方法、成員、屬性,你直接調用就行;但如果你和父類都有相同名稱的方法或者你想要調用父類的方法,中要加上base就行,比如你要用父類的prind()方法:base.prind()。
B:如果我繼承多個類哪不就是不用自己實現方法了,只要父類中有就行了?
C:是不行的,類只可以繼承一個父類,不能多次繼承;但父類可以有多個子類。
B:哪我可以和父類通信嗎?
C:可以啊,不過只有帶參的構造函數才能進行通信;在你自己的有參構造函數後面加上base(參數),以“:”隔開這樣就能通信了,當然你的父類也要有帶參的構造函數,不然就不知道是通信給誰父類的哪個成員或屬性了。
從A、B、C類的對話中我們可以看出類的繼承還有不只是上面代碼的這麼少東西,哪麼接下來我們就來看看base在類的繼承中的用法:
class A
{
public A(int i)
{
Console.WriteLine("初始化A類"+i);
}
public void prind()
{
Console.WriteLine("A");
}
private void Sprind()
{
Console.WriteLine("我是A類的私有方法Sprind");
}
}
class B:A
{
public B(int i):base(i)
{
Console.WriteLine("初始化B類"+i);
}
public void prind()
{
Console.WriteLine("B");
}
}
class C
{
static void Main(string []args)
{
B b=new B(1);
base.prind();
base.Sprind();
b.prind();
((A)b).prind();
}
}
輸出結果:
初始化A類1
初始化B類1
A
我是A類的私有方法
B
A
對於上面的代碼應該都了解,但對於最後一句可能就有疑問了;怎麼會輸出“A”的呢?b是B類的實例啊?
其實這和數據類型的轉換是同一原理,類也要可以轉換的,只是它是轉換成父類而已。