11

サブクラスにそのスーパークラスの特定の属性を実装させるにはどうすればよいですか?その理由は、「DisplayName」、「Description」、「Capabilities」など、クラスに関する一般的な情報に属性を使用したいためです。

それで、私はそれらをスーパークラスに実装し、サブクラスに属性を実装するように強制するかもしれないと思いました。

abstractメソッドのような属性のようなものはありますか?

[abstract DeclareMe]
public abstract class InheritMe {
    public abstract void DeclareMe();
}
4

2 に答える 2

9

クラスは遅かれ早かれ実行する必要があるため、基本クラスにチェックメカニズムを追加して、サブクラスに特定の属性が存在することを確認できます。

ここにあなたのためのいくつかのサンプルコードがあります。

class Program
{
    static void Main(string[] args)
    {
        var a = new SubA();
        var b = new SubB();
    }
}

class BaseClass
{
    public BaseClass()
    {
        Type t = GetType();
        if (t.IsDefined(typeof(SerializableAttribute), false) == false)
        {
            Console.WriteLine("bad implementation");
            throw new InvalidOperationException();
        }
        Console.WriteLine("good implementation");
    }
}

[Serializable]
class SubA : BaseClass
{ }

class SubB : BaseClass
{ }

最後の言葉は、自分自身をあまり警戒しないでください。設計をしていると、2つのメソッドを間違った順序で呼び出すか、何かをするのを忘れるかもしれないといつも思っていました。それから、起こりうる間違いを防ぐために、単純な設計を複雑な設計に変えました。後で私は警備員を捨て、例外を投げるだけで、予期しない状況を検出するために使用されるコードはで囲まれていました#if DEBUG

于 2012-07-10T08:31:20.450 に答える
6

他のスレッドからの回答に加えて:

FxCopを使用して、属性が存在するかどうかをチェックするカスタムルールを実装できます。

于 2012-07-10T08:15:14.533 に答える