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