2013-02-27 161 views
4
class baseClass 
{ 
    derivedClass nm = new derivedClass(); 
} 

class derivedClass : baseClass 
{ 
} 

此代碼構建正常。 C#允許在baseClass中創建derivedClass對象的可能原因是什麼?你能想到這樣做的具體原因嗎?基類中派生的實例

+0

爲什麼你認爲C#應該限制它? – yogi 2013-02-27 07:14:10

+0

你知道任何限制它的面向對象的語言嗎?沒有什麼特別的。 – 2013-02-27 07:16:42

+0

我無法想到在'baseClass'中創建'derivedClass'實例的原因。所以我想知道爲什麼C#允許它? – 2013-02-27 07:16:47

回答

12

此代碼構建正常。

是的 - 爲什麼你認爲它不會?

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(); 
} 
+0

:它的靜態工廠方法,你可能想寫靜態工廠或創建方法。 – TalentTuner 2013-02-27 07:18:11

+0

@Saurabh:改爲「靜態工廠方法」,但我不確定這裏的區別有多大好處,說實話。 – 2013-02-27 07:23:37

+0

:我已閱讀了有關如下所示的差異的地方創建方法:創建(或克隆)類實例的靜態或非靜態方法。 工廠方法:在層次結構中定義和實現的方法,以提供某些類類型的多態創建。 – TalentTuner 2013-02-27 07:26:59

0

一個明顯的例子是在基類返回基於一些條件合適的實現的工廠方法。

0

derivedClass可以在baseClass中實例化,因爲它是一個可訪問的類。沒有理由爲什麼c#應該限制你這樣做。同樣,您可以在baseClass本身內創建baseClass的實例。

1

我曾經使用過的開發人員在我們的代碼庫中生成了這些代碼。我個人認同它的用處。

public class Foo 
{ 
    public static Foo MagicalFooValue 
    { 
     get { return Bar.Instance; } 
    } 

    private class Bar : Foo 
    { 
     //Implemented as a private singleton 
    } 
} 
相關問題