class baseClass
{
derivedClass nm = new derivedClass();
}
class derivedClass : baseClass
{
}
此代碼構建正常。 C#允許在baseClass
中創建derivedClass
對象的可能原因是什麼?你能想到這樣做的具體原因嗎?基類中派生的實例
class baseClass
{
derivedClass nm = new derivedClass();
}
class derivedClass : baseClass
{
}
此代碼構建正常。 C#允許在baseClass
中創建derivedClass
對象的可能原因是什麼?你能想到這樣做的具體原因嗎?基類中派生的實例
此代碼構建正常。
是的 - 爲什麼你認爲它不會?
C#允許在baseClass中創建derivedClass對象的可能原因是什麼?
因爲沒有理由禁止它嗎?
你能想到這樣做的具體原因嗎?
靜態工廠方法,例如?
// BaseClass gets to decide which concrete class to return
public static BaseClass GetInstance()
{
return new DerivedClass();
}
這實際上是一個很常見的模式。例如,我們在Noda Time中使用了很多,其中CalendarSystem
是一個公共抽象類,但所有具體派生類都是內部的。
當然,你已經給出了確切的例子 - 通過創建一個派生類的實例來初始化自己 - 因爲它會由於遞歸而炸燬堆棧 - 但這不是一個問題它是一個派生類。你會通過初始化相同類得到同樣的事情:
class Bang
{
// Recursively call constructor until the stack overflows.
Bang bang = new Bang();
}
:它的靜態工廠方法,你可能想寫靜態工廠或創建方法。 – TalentTuner 2013-02-27 07:18:11
@Saurabh:改爲「靜態工廠方法」,但我不確定這裏的區別有多大好處,說實話。 – 2013-02-27 07:23:37
:我已閱讀了有關如下所示的差異的地方創建方法:創建(或克隆)類實例的靜態或非靜態方法。 工廠方法:在層次結構中定義和實現的方法,以提供某些類類型的多態創建。 – TalentTuner 2013-02-27 07:26:59
一個明顯的例子是在基類返回基於一些條件合適的實現的工廠方法。
derivedClass
可以在baseClass
中實例化,因爲它是一個可訪問的類。沒有理由爲什麼c#應該限制你這樣做。同樣,您可以在baseClass
本身內創建baseClass
的實例。
我曾經使用過的開發人員在我們的代碼庫中生成了這些代碼。我個人認同它的用處。
public class Foo
{
public static Foo MagicalFooValue
{
get { return Bar.Instance; }
}
private class Bar : Foo
{
//Implemented as a private singleton
}
}
爲什麼你認爲C#應該限制它? – yogi 2013-02-27 07:14:10
你知道任何限制它的面向對象的語言嗎?沒有什麼特別的。 – 2013-02-27 07:16:42
我無法想到在'baseClass'中創建'derivedClass'實例的原因。所以我想知道爲什麼C#允許它? – 2013-02-27 07:16:47