3

わかりました... Objective Cでは、静的メソッドでは「this」はインスタンスではなくクラスを参照するため、「new this()」を使用して基本クラスの静的メソッドからサブクラスを新しく作成できます。私が最初に見つけたとき、それはかなりクールな発見であり、私はそれを頻繁に使用しています.

ただし、C# では機能しません。くそ!

だから...静的基本クラスメソッド内からサブクラスを「新しく」作成する方法を知っている人はいますか?

このようなもの...

public class MyBaseClass{

    string name;

    public static Object GimmeOne(string name){

     // What would I replace 'this' with in C#?
        return new this(name); 

    }

    public MyBaseClass(string name){
        this.name = name;
    }

}

// No need to write redundant constructors
   public class SubClass1 : MyBaseClass{ }
   public class SubClass2 : MyBaseClass{ }
   public class SubClass3 : MyBaseClass{ }

SubClass1 foo = SubClass1.GimmeOne("I am Foo");

はい、コンストラクターを直接使用できる (通常は使用する) ことはわかっていますが、基本クラスで共有メンバーを呼び出す必要があるため、質問しています。繰り返しますが、Objective C でこれをやらせてください。C# もそうなることを願っています。

それで... テイカーはいますか?

4

2 に答える 2

6

C# には、これとまったく同じものはありません。ただし、次のようなジェネリック型制約を使用することで、これを回避できる可能性があります。

public class MyBaseClass
{
    public string Name { get; private set; }

    public static T GimmeOne<T>(string name) where T : MyBaseClass, new()
    {
        return new T() { Name = name };
    }

    protected MyBaseClass()
    {
    }

    protected MyBaseClass(string name)
    {
        this.Name = name;
    }
}

new() 制約は、パラメーターなしのコンストラクターがあることを示しています - あなたはそうではありませんでしたが、消費者からそれを隠すために非公開にしています。次に、次のように呼び出すことができます。

var foo = SubClass1.GimmeOne<SubClass1>("I am Foo");
于 2010-09-09T04:03:30.687 に答える
0

申し訳ありませんが、これはできません。C# は道徳的に静的メソッドの継承に反対しています。その GimmeOne メソッドは MyBaseClass 以外の型を持つことはなく、SubClass1 から呼び出すことは問題ではありません。それは依然として「実際には」MyBaseClass 呼び出しです。Reflection ライブラリはこの構築を行うことができますが、そこから MyBaseClass 以外のものを取得することはできません。

静的メソッドを呼び出している場合は、おそらくどのサブクラスから呼び出しているかを知っているでしょう。サブクラスごとに異なるファクトリ メソッドを作成します。実際にこれをインスタンスで実行しようとしている場合は、代わりに非静的仮想ファクトリ メソッドを使用する必要があります (関数の最も派生した形式を自動的に呼び出します。これはおそらく必要なものです)。

于 2010-09-09T04:00:03.800 に答える