2016-05-23 5 views
3

私はカップルのクラスがあります。派生クラスのフィールドも派生させることは可能ですか?

public class A { 
    public int value; 

    public A(int value) { 
     this.value = value; 
    } 
} 

public class B : A { 
    public B(int value) : base(value) { } 
} 

public class Base { 
    public A someobject; 

    public Base(A someobject) 
    { 
     this.someobject = someobject; 
    } 
} 

私はクラスBaseから派生したい場合は、私はこれを書くことができます。

public class Derived : Base { 
    public Derived(A someobject) : base(someobject) { } 
} 

しかし、それは、この例のように派生サブクラスであるとsomeobjectフィールドのデータ型を変更することは可能でしょうか?

public class Derived : Base { 
    public B someobject; 

    public Derived(B someobject) : base(someobject) { } 
} 
+0

いいえ、あなたは 'someobject'フィールドのデータ型を変更することはできません。あなたは現在、ベースフィールドを隠していて、 'Derived'で新しいフィールドを宣言しています。あなたのコードはコンパイルされ、フィールド隠蔽によって生成された警告とは別に動作します。 – Blorgbeard

答えて

5

いいえ、不可能です。危険です。ちょうど注:フィールドではなく、プロパティではありません。ベースフィールドを非表示にしていますが、それらをすべて上書きすることはできません。ただし、プロパティでも、オーバーライド時にプロパティの戻り値の型を変更することはできません。

は、次の点を考慮

void Main() 
{ 
    Base myThing = new Derived(); 
    //We view it as a Base object, so we can assign any Animal to MyAnimal 
    myThing.MyAnimal = new Cat(); 

    //Now let's cast it back to Derived 
    Derived myCastThing = (Derived)myThing; 
    myCastThing.MyAnimal; //We expect a Dog, but we get a Cat? 
} 

public class Base 
{ 
    public virtual Animal MyAnimal { get; set; } 
} 
public class Derived : Base 
{ 
    public override Dog MyAnimal { get; set; } 
} 
public class Animal { } 
public class Dog : Animal { } 
public class Cat : Animal { } 

ただし、あなたがジェネリックを使用して欲しいものを達成することができます

public class Base<TAnimalType> where TAnimalType : Animal 
{ 
    public virtual TAnimalType MyAnimal { get; set; } 
} 

public class Derived : Base<Dog> 
{ 
    public override Dog MyAnimal { get; set; } 
} 
+1

***ジェネリック***、私はあなたが意味すると思う:) –

+0

@DavidLおっと!更新、ありがとう:) – Rob

+0

Np、素晴らしい答え! +1 –

関連する問題