派生クラスからその基本クラスに属性引数を渡すことは可能ですか?
基本的に、派生クラスからプロパティの属性の引数を設定しようとしています。
C++ でそれを行う方法
public class HasHistory<T, string name> { public HasHistory() { History=new History<T>(); } // here's my attribute [BsonElement(name)] public History<T> History { get; protected set; } }
ただし、型以外のテンプレート引数は C++ では有効ですが、C#では無効です。
C# での予期せぬ回避策
プロパティを仮想化し、派生クラスに属性を追加できることに気付きました。しかし、コンストラクターで仮想関数を呼び出すことになります。それはうまくいくかもしれませんが、それは悪い習慣です。
基本クラスのコンストラクターでメンバーを初期化する必要があるため、その呼び出しを行いたいと思います。実際、それが基本クラスの要点です。
public class HasHistory<T> { public HasHistory() { // this will be called before Derived is constructed // and so the vtbl will point to the property method // defined in this class. // We could probably get away with this, but it smells. History=new History<T>(); } // here's my property, without an Attribute public virtual History<T> History { protected set; get; } } public class Derived: HasHistory<SomeType> { // crap! I made this virtual and repeated the declaration // just so I could add an attribute! [BsonElement("SomeTypeHistory")] public virtual HasHistory<SomeType> History { protected set; get; } }
したがって、属性をベースに配置することはできず、代わりに、保護されたベースクラスのプロパティの観点から実装されている/使用する派生クラスのプロパティに配置することはできなかったと思いますが、それは面倒なので、ベースを使用することによって得られる利便性を排除しますクラス。
これを行う良い方法がありますよね?右?
派生クラスのプロパティをオーバーライドせずに、ベースから継承する派生クラスのプロパティの属性を再定義するにはどうすればよいですか?