0

抽象クラス AbstractClass に次のようなプロパティがあるとします。

protected MyClass MyProperty { get; set; }

このプロパティは、AbstractClass の多くの (仮想) メソッドで使用されます。AbstractClass のサブクラスで、MyProperty を MyClass のサブクラスにしたいのですが、これは可能ですか、それともキャストする必要がありますか?

MyProperty = new SubclassOfMyClass();
((SubclassOfMyClass)MyProperty).Method();

見栄えがよくありません...「new」キーワードを使用して、次のように MyProperty を非表示にしようとしました。

protected new SubclassOfMyClass MyProperty { get; set; }

しかし、2 番目の MyProperty を作成するように見え、AbstractClass のものが常に null になるため、これは思ったほどうまくいきませんでした。

だから私はちょっとハックのように見えるかもしれない何かを思いついた:

protected new SubclassOfMyClass MyProperty 
{
    get { return base.MyProperty as SubclassOfMyClass; }
    set { base.MyProperty = value; }
}

これを行うより良い方法はありますか?

4

1 に答える 1

0

ジェネリックを使用できます:

public abstract class AbstractClass<T> where T : MyClass, new() {
    protected T MyProperty { get; set; }
}

public class SubClass : AbstractClass<SubclassOfMyClass> {
}

編集:

これはあなたの「ハック」への対応です:

次のコードを検討してください。

public class MyClass { }
public class SubclassOfMyClass : MyClass { }

public abstract class AbstractClass
{
    public MyClass MyProperty { get; set; }
}

public class Subclass : AbstractClass
{
    public new SubclassOfMyClass MyProperty
    {
        get { return base.MyProperty as SubclassOfMyClass; }
        set { base.MyProperty = value; }
    }
}

public class Test
{
    public static void Main()
    {
        AbstractClass sub = new Subclass();
        sub.MyProperty = new MyClass();

        Subclass sub2 = (Subclass)sub;//casting succeeds since sub is Subclass 
        if (sub2.MyProperty == null)
            Console.WriteLine("sub2.MyProperty is null!");
    }
}

これは実際に「sub2.MyProperty is null!」と出力します。にキャストsubsub2てからアクセスした後も、型のままでsub2.MyProperty base.MyProperty予想どおり null を返しますMyClassbase.MyProperty as SubclassOfMyClassしたがって、newキーワードを使用する場合は、舞台裏で何が起こっているかを本当に知っておく必要があります。

于 2013-10-11T08:39:20.120 に答える