42

最近、「静的抽象」メソッドが必要と思われる問題が発生しました。なぜそれが不可能なのかはわかっていますが、どうすればこの制限を回避できますか?

たとえば、説明文字列を持つ抽象クラスがあります。この文字列はすべてのインスタンスに共通であるため、静的としてマークされていますが、このクラスから派生したすべてのクラスが独自のDescriptionプロパティを提供することを要求したいので、抽象としてマークしました。

abstract class AbstractBase
{
    ...
    public static abstract string Description{get;}
    ...
}

もちろんコンパイルされません。インターフェイスを使用することを考えましたが、インターフェイスに静的メソッドシグネチャが含まれていない可能性があります。

単に非静的にし、そのクラス固有の情報を取得するために常にインスタンスを取得する必要がありますか?

何か案は?

4

8 に答える 8

33

できません。

これを行う場所は、属性を使用することです。

例えば

[Name("FooClass")]
class Foo
{
}
于 2009-05-05T07:02:10.220 に答える
7

Description プロパティを適切に実装するために実装を延期することを気にしない場合は、単純に行うことができます。

public abstract string ClassDescription {get; } 
// ClassDescription is more intention-revealing than Description

クラスを実装すると、次のようになります。

static string classDescription="My Description for this class";
override string  ClassDescription { get { return classDescription; } }

次に、クラスは説明を持つという契約に従う必要がありますが、賢明に行うことはクラスに任せます。オブジェクト指向の方法で実装を指定する方法はありません (残酷で壊れやすいハックによる場合を除きます)。

ただし、私の考えでは、この説明はクラス メタデータであるため、他の人が説明したように属性メカニズムを使用することをお勧めします。リフレクションの複数の使用が特に心配な場合は、関心のある属性を反映するオブジェクトを作成し、Type と Description の間にディクショナリを格納します。これにより、リフレクションが最小限に抑えられます (実行時の型検査以外は、それほど悪くはありません)。ディクショナリは、通常この情報を必要とするクラスのメンバーとして格納できます。または、ドメイン全体のクライアントが必要とする場合は、シングルトンまたはコンテキスト オブジェクトを介して格納できます。

于 2009-05-11T18:20:46.527 に答える
6

静的と抽象を組み合わせるのは、いくぶん意味がありません。staticの背後にある考え方は、問題のメンバーを使用するためにクラスのインスタンスを提示する必要がないということです。ただし、抽象では、インスタンスは具体的な実装を提供する派生クラスであることが期待されます。

この種の組み合わせが必要な理由はわかりますが、実際には、「this」または非静的メンバーの実装での使用を拒否することが唯一の効果です。つまり、抽象メンバーと「静的抽象」メンバーの呼び出しに根本的な違いはありませんが、親クラスは派生クラスの実装に制限を課します(どちらも、使用する実装を把握するための具体的なインスタンスが必要になるため)

于 2009-05-05T07:03:47.830 に答える
6

それが静的である場合、変数のインスタンスは 1 つしかありません。派生クラスの静的変数を使用して達成したいことを実行できる場合、継承がどのように意味があるかわかりません。個人的には、インスタンス var を回避しようとしていると思います。

古典的な方法だけではないのはなぜですか?

abstract class AbstractBase
{
    protected string _Description = "I am boring abstract default value";
}

class Foo : AbstractBase {

     public Foo() {
       _Description = "I am foo!";
     }
}
于 2009-05-05T07:16:28.377 に答える
3

インスタンスで呼び出す必要がある場合は、静的ではありません。

インスタンスで呼び出していない場合は、ポリモーフィズムは発生しません(つまり、言語に関する限り、ChildA.DescriptionはChildB.Descriptionとは完全に無関係です)。

于 2009-05-05T07:03:00.420 に答える