4
class baseClass
{
    derivedClass nm = new derivedClass();
}

class derivedClass : baseClass
{
}

このコードは正常にビルドされます。derivedClassC# でオブジェクトの作成を許可する理由として考えられるものは何ですかbaseClass。これを行う具体的な理由は何か考えられますか?

4

4 に答える 4

12

このコードは正常にビルドされます。

はい - なぜそうならないと思いますか?

C# が baseClass での派生クラス オブジェクトの作成を許可する理由として考えられるものは何ですか。

禁止する理由がないから?

これを行う具体的な理由は何か考えられますか?

たとえば、静的ファクトリメソッドは?

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

実はよくあるパターンです。たとえば、野田タイムではよく使用します。 whereCalendarSystemは public 抽象クラスですが、具体的な派生クラスはすべて内部クラスです。

確かに、あなたが与えた正確な例を持つのはクレイジーです-インスタンスフィールドが派生クラスのインスタンスを作成することによってそれ自体を初期化します-再帰のためにスタックを爆破するためです-しかし、それは派生であるという問題ではありませんクラス。同じクラスを初期化することで、同じことが得られます。

class Bang
{
    // Recursively call constructor until the stack overflows.
    Bang bang = new Bang();
}
于 2013-02-27T07:15:22.597 に答える
1

私が一緒に働いていた開発者は、コードベースでこのコードを作成しました。私は個人的にその有用性に同意します。

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

    private class Bar : Foo
    {
        //Implemented as a private singleton
    }
}
于 2013-02-27T07:27:21.890 に答える
0

明白なケースの 1 つは、基本クラスにファクトリ メソッドがあり、何らかの条件に基づいて適切な実装を返すことです。

于 2013-02-27T07:15:45.503 に答える
0

derivedClassbaseClassアクセス可能なクラスであるため、インスタンス化できます。C# がそうすることを制限する理由はありません。baseClass同様に、それ自体の中にのインスタンスを作成できますbaseClass

于 2013-02-27T07:15:55.563 に答える