我通過刪除一些空的構造函數使我的構造函數更加嚴格一些。我很新的繼承,並與我得到的錯誤困惑:基類不包含無參數構造函數。我怎樣才能使A2從A繼承,而A中沒有空的構造函數。另外,爲了我個人的理解,爲什麼A2需要A的空構造函數?基類不包含無參數構造函數?
Class A{
//No empty constructor for A
//Blah blah blah...
}
Class A2 : A{
//The error appears here
}
我通過刪除一些空的構造函數使我的構造函數更加嚴格一些。我很新的繼承,並與我得到的錯誤困惑:基類不包含無參數構造函數。我怎樣才能使A2從A繼承,而A中沒有空的構造函數。另外,爲了我個人的理解,爲什麼A2需要A的空構造函數?基類不包含無參數構造函數?
Class A{
//No empty constructor for A
//Blah blah blah...
}
Class A2 : A{
//The error appears here
}
在A2類中,您需要確保所有構造函數都使用參數調用基類構造函數。
否則,編譯器將假定您想使用無參數基類構造函數來構造A2對象所基於的A對象。
例子:
class A
{
public A(int x, int y)
{
// do something
}
}
class A2 : A
{
public A2() : base(1, 5)
{
// do something
}
public A2(int x, int y) : base(x, y)
{
// do something
}
// This would not compile:
public A2(int x, int y)
{
// the compiler will look for a constructor A(), which doesn't exist
}
}
如果你的基類沒有參數的構造函數,你需要使用base
關鍵字來調用一個從你的派生類:
class A
{
public A(Foo bar)
{
}
}
class A2 : A
{
public A2()
: base(new Foo())
{
}
}
例子:
class A2 : A
{
A2() : base(0)
{
}
}
class A
{
A(int something)
{
...
}
}
將基類放在第一位通常很容易閱讀。 –
將基類放在不同的文件中更爲常見。 – Joe
它有致電一些構造函數。默認是撥打base()
。
您還可以在調用base()
時將靜態方法,文字和任何參數用於當前構造函數。
public static class MyStaticClass
{
public static int DoIntWork(string i)
{
//for example only
return 0;
}
}
public class A
{
public A(int i)
{
}
}
public class B : A
{
public B(string x) : base(MyStaticClass.DoIntWork(x))
{
}
}
,因爲如果沒有默認的構造函數,然後A2的構造函數需要調用基()與參數A的構造函數看到這個問題:當您創建的對象Calling the base constructor in C#
您您的基類構造函數會自動調用。因此,當您創建派生類對象時,並且派生類對象沒有帶一個或多個參數的構造函數時,將不會傳遞給需要一個論據。 所以要做到這一點,你需要的東西傳遞給基類構造函數如下:
Class A{
//No empty constructor for A
//Blah blah blah...
}
Class A2 : A{
public A2():base(some parameter)
}
你不能沒有構造函數創建一個類的對象。如果你不想無參數的話,可以創建一個接受一些參數的構造函數。 –
我應該在OP中更加清楚,A類和A2類都有帶參數的構造函數,我只是想刪除無參數的構造函數,以便創建一個類的實例,您需要該類的所有必要參數工作。這似乎是一件很直觀的事情,這是一個明智的做事方式嗎? – sooprise