類構造函數是總是在您實例化派生類時調用。如果基類有一個默認的構造函數,如果你省略了對基類構造函數的顯式調用,這將會被調用。
E.g.
class Base
{
int x;
int y;
//default constructor
public Base()
{
x = -1;
y = -1;
}
public Base(int x, int y)
{
this.x = x;
this.y = y;
}
}
class Derived
{
public Derived()
{
}
}
當Derived對象被創建時,這將編譯和設置派生的實例字段爲-1。 但是,如果你省略了默認的構造函數,你會得到一個像你所描述的編譯錯誤。現在,編譯器無法自動生成對基礎構造函數的調用。我想知道哪些參數與
base(x=??,y=??)
一般稱呼它,你應該有公共字段/名稱相同的屬性多次聲明,這是幾乎總是一個強大的設計味道。 如果基類具有受保護的內部或公共字段/屬性,派生類也是如此(內部有一些奇怪的情況)。對於方法,您可以隱藏方法的基類實現或覆蓋它。後者是更常見的,並且要求基本定義是抽象的或虛擬的,例如 ,例如如果你
//this requires Base to be declared abstract as well
public abstract void AbstractMethod();
public virtual void VirtualMethod(){}
,使您如果需要隱藏你能做到的方法,雖然它一般不鼓勵(見下爲什麼)寫入在派生類中
public override void AbstractMethod(){}
public override void VirtualMethod(){}
如下 剛重新聲明編譯器會給你一個警告的方法,但你可以用new來告訴編譯器你實際上想要隱藏的方法它看起來像這樣:
public new void SomeHiddenMethod(){}
怎麼過這個地區在使用該類型的對象的(潛在的)休影響
public void SomeMEthod(Derived d)
{
//this calls the implementation in Derived
d.SomeHiddenMethod();
Base b = d;
//this calls the implementation in Base
b.SomeHiddenMethod();
}
隱藏方法從而使得它非常難推理的代碼,因爲調用同樣的方法對同一對象可能即使對象在兩次調用之間沒有改變狀態,但僅僅是因爲變量的聲明類型發生了更改,結果也會有所不同。
關於繼承的最後一點說明,您應該避免繼承功能,簡而言之,就是因爲您需要兩個(無關的)類中的相同功能,您不應該創建基類來保存該功能,而應該創建第三個類並注入該類的實例(或類似方法),並且在設計一個類的公共接口時,您應該考慮很多有關Liskov substitutional principle的內容。