1

なぜこれが不可能なのですか?コンストラクターパラメーターを使用して「DerivedClass」をインスタンス化すると、次のコンパイラエラーが発生します。

'GenericParameterizedConstructor.DerivedClass'には、1つの引数を取るコンストラクターが含まれていません

しかし、非常によく似たメソッドを呼び出すことは機能します。

なんで?

class Program
{
    static void Main(string[] args)
    {
        // This one produces a compile error 
        // DerivedClass cls = new DerivedClass("Some value");

        // This one works;
        DerivedClass cls2 = new DerivedClass();
        cls2.SomeMethod("Some value");
    }
}


public class BaseClass<T>
{
    internal T Value;

    public BaseClass()
    {
    }

    public BaseClass(T value)
    {
        this.Value = value;
    }

    public void SomeMethod(T value)
    {
        this.Value = value;
    }
}

public class DerivedClass : BaseClass<String>
{
}
4

3 に答える 3

5

コンストラクターは継承されません-それはそれと同じくらい簡単です。DerivedClass単一のコンストラクターが含まれています。コンストラクターを指定していないため、コンパイラーによってデフォルトで提供されるパブリックパラメーターなしのコンストラクターです。

これはジェネリックとは何の関係もないことに注意してください。BaseClass一般的でない場合も同じことがわかります。

ただし、コンストラクターを提供するのは簡単です。DerivedClass

public class DerivedClass : BaseClass<String>
{
    public DerivedClass() : base()
    {
    }

    public DerivedClass(string value) : base(value)
    {
    }
}
于 2012-08-28T20:45:41.963 に答える
0

基本クラスのすべてを正確に模倣してラップする特定の派生クラスコンストラクターを自動的に生成するようにコンパイラーに指示する方法があると役立つ場合があります。ただし、このような動作をデフォルトで発生させると、問題が発生します。多くの派生クラスは、そのタイプのインスタンスが作成されるたびに、コードの一部が呼び出されることを期待しています。親型に2つのコンストラクターがあるとします。

parentType(int foo){...}
parentType(string foo){...}

派生型には次のものがあります。

派生型(文字列foo){...}

効果はどうあるべきnew derivedType(7);ですか?コンパイラはを作成する方法を知っていますがnew baseType(7);、新しい「空白の」derivedTypeオブジェクトを作成し、単に親型コンストラクタを呼び出すと、結果は、の構築コードderivedTypeを実行したことのないオブジェクトになります。derivedType一部のクラスでは問題はありませんが(そのようなクラスの場合は、前述の架空の機能が役立ちます)、多くのクラスで問題が発生します。

ちなみに、保護されたコンストラクターでは、多少関連する問題が発生します。少なくとも現在のバージョンのC#を含む一部の.net言語では、非抽象型Fooが保護されたコンストラクターを定義している場合、そのコンストラクターは派生型のインスタンスを作成するためにのみ使用できます。現在のvb.netを含む他の言語では、派生型内のコードが基本型の保護されたコンストラクターを呼び出して、新しい基本型インスタンスを作成することができます。

于 2012-09-26T16:07:28.250 に答える
0

派生クラスはコンストラクターを公開する必要があります

public class DerivedClass : BaseClass<String>
{
    public DerivedClass(string str) :base(str) {}
}
于 2012-08-28T20:46:27.727 に答える