2013-02-27 159 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 
    } 
} 
相关问题