【问题标题】:derived instance in base class基类中的派生实例
【发布时间】:2013-02-12 21:51:56
【问题描述】:
class baseClass
{
    derivedClass nm = new derivedClass();
}

class derivedClass : baseClass
{
}

此代码构建良好。 C# 允许在baseClass 中创建derivedClass 对象的可能原因是什么。你能想出这样做的任何具体原因吗?

【问题讨论】:

  • 你为什么认为 C# 应该限制这一点?
  • 你知道任何限制它的面向对象语言吗?它没有什么特别之处。
  • 我想不出在baseClass 中创建derivedClass 实例的原因。所以我想知道为什么 C# 允许它?
  • @MD.Unicorn:不……我不知道有任何语言限制这一点。但是,如果它没有用,他们为什么不限制呢?如果出于某种原因我们可以使用它,请告诉我原因。
  • 想不出用法并不是禁止某事的好理由。我发现类被密封的次数,因为原始开发人员无法想到你会继承它的情况......

标签: c# .net inheritance polymorphism


【解决方案1】:

此代码构建良好。

是的 - 为什么你认为它不会?

C# 允许在基类中创建派生类对象的可能原因是什么。

因为没有理由禁止它?

你能想出这样做的任何具体原因吗?

例如静态工厂方法?

// BaseClass gets to decide which concrete class to return
public static BaseClass GetInstance()
{
    return new DerivedClass();
}

这实际上是一种非常常见的模式。我们在Noda Time 中经常使用它,例如CalendarSystem 是一个公共抽象类,但所有具体派生类都是内部的。

当然,拥有您给出的确切示例真是太疯狂了 - 实例字段通过创建派生类的实例来初始化自身 - 因为它会由于递归而炸毁堆栈 - 但这不是问题作为派生类。通过初始化 same 类,你会得到同样的结果:

class Bang
{
    // Recursively call constructor until the stack overflows.
    Bang bang = new Bang();
}

【讨论】:

  • :如果是静态的,它不是工厂方法,你可能想写静态工厂或创建方法。
  • @Saurabh:更改为“静态工厂方法”,但老实说,我不确定这里的区别有多大好处。
  • :我在某处读到了以下差异 创建方法:创建(或克隆)类实例的静态或非静态方法。工厂方法:在层次结构中定义和实现的方法,以提供某种类类型的多态创建。
  • @Saurabh:关于工厂方法的维基百科页面包含类似的示例,他们称之为“静态工厂方法”。他们指出它不符合工厂方法模式,因为没有多态性,但含义很清楚 IMO。 (顺便说一句,你为什么在你的 cmets 前加上“:”?)
  • @user1416420:“当然,有你给出的确切示例太疯狂了,因为它会由于递归而炸毁堆栈”以什么方式没有明确说明堆栈会炸毁?
【解决方案2】:

我曾经合作过的一位开发人员在我们的代码库中生成了这段代码。我个人同意它很有用。

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

    private class Bar : Foo
    {
        //Implemented as a private singleton
    }
}

【讨论】:

    【解决方案3】:

    一个明显的例子是在基类中有一个工厂方法根据某些条件返回适当的实现。

    【讨论】:

      【解决方案4】:

      derivedClass 可以在baseClass 中实例化,因为它是一个可访问的类。 c# 没有理由限制你这样做。同样,您可以在baseClass 本身内创建baseClass 的实例。

      【讨论】:

        猜你喜欢
        • 2014-04-27
        • 2023-03-19
        • 1970-01-01
        • 2014-09-29
        • 1970-01-01
        • 1970-01-01
        • 2019-07-25
        • 2015-03-23
        • 1970-01-01
        相关资源
        最近更新 更多