5

classmethodC#でPythonで何をするかを行う方法はありますか?

つまり、使用元のサブクラスに応じて、Typeオブジェクトを(暗黙の)パラメーターとして取得する静的関数です。

私が欲しいものの例は、おおよそです

class Base:
    @classmethod
    def get(cls, id):
        print "Would instantiate a new %r with ID %d."%(cls, id)

class Puppy(Base):
    pass

class Kitten(Base):
    pass

p = Puppy.get(1)
k = Kitten.get(1)

期待される出力は

Would instantiate a new <class __main__.Puppy at 0x403533ec> with ID 1.
Would instantiate a new <class __main__.Kitten at 0x4035341c> with ID 1.

(ここのコードパッドの同じコード。)

4

5 に答える 5

3

ジェネリックを見てみたいと思います。

MSFTからのガイド:

http://msdn.microsoft.com/en-us/library/ms379564(VS.80).aspx

于 2010-01-13T17:37:03.667 に答える
2

コンテキストに応じて、ジェネリックまたは仮想メソッドのいずれかが必要です。

于 2010-01-14T02:36:41.750 に答える
2

原則として、次のように書くことができます。

class Base
{
    public static T Get<T>(int id)
        where T : Base, new()
    {
        return new T() { ID = id };
    }

    public int ID { get; set; }
}

次に、書くことができますvar p = Base.Get<Puppy>(10)。または、自虐的であると感じている場合は、書くことPuppy.Get<Puppy>(10)もできKitty.Get<Puppy>ます ;) すべての場合において、暗黙的ではなく、明示的に型を渡す必要があります。

または、これも機能します。

class Base<T> where T : Base<T>, new()
{
    public static T Get(int id)
    {
        return new T() { ID = id };
    }

    public int ID { get; set; }
}

class Puppy : Base<Puppy>
{
}

class Kitten : Base<Kitten>
{
}

期待どおりに記述できるように、型を基本クラスに戻す必要がありますPuppy.Get(10)

var p = new Puppy(10)しかし、が同じくらい簡潔でより慣用的であるのに、そのように書く理由はありますか? おそらくそうではありません。

于 2010-01-15T09:07:42.817 に答える
0

これは、Object Pascal のクラス メソッドに相当します。(.Net 実装は RemObject の酸素になります)。

ただし、クラス参照、したがってクラスレベルの状態にアクセスできる仮想クラスメソッドまたは一見静的なメソッドは、元のプラットフォームでは優れていますが、.Net や C# ではあまり意味がないと思います。

私も数年間 Oxygene でプログラミングを行っていましたが、クラス参照はまったく必要ありませんでした。

使い方を知らなかったからではありません。「元の」ObjectPascal プラットフォームであるネイティブ Delphi では、私はそれらを常に使用していました。しかし、.Net と BCL はそれらを実際にサポートしていないため、それらを使用しても何の利点もありません。一方、python やネイティブ Delphi などのプラットフォームは、ライブラリでそれらをサポートしています。

明らかに静的メソッドは必要ありません。必要なのは、状態を持つことができる、および/または継承をサポートするものです。したがって、工場、またはあなたの場合はコンストラクターでも問題ない可能性があります。

于 2010-01-15T09:17:06.463 に答える