2017-08-15 12 views
-5

で抽象親クラスから子インスタンスの実装関数を呼び出すここでは、次のとおりです。は、C#

abstract class IA 
{ 
    public virtual void ChangePropertyOfAIChild() 
    { 
    b.value = true; 
    } 
} 
... 
class B:IA 
{ 
    bool value; 

} 

class C:IA 
{ 
    bool value; 
} 
.... 
///main 
IA newBInstance = new B(); 
newBInstance.ChangePropertyOfAIChild(); 

IA newCInstance = new C(); 
newCInstance .ChangePropertyOfAIChild(); 

///// 

基本抽象クラスから子供のクラスですでにimplememnted機能をcalliingし、変更の適切な方法だろう何それは価値ですか? ありがとう!

+1

BがAの子である場合、AはどのようにBが存在することを知っていますか?あなたの階層は後方にあります –

+0

私はここに何かを見逃していますか?このコードはコンパイルされません。存在していないもののプロパティには、どうやってアクセスしますか? – Sach

答えて

1

@Camilo Terevintoが指摘したように、あなたは階層が間違っています。試してみてください。

(b.value =真)

public abstract class IA 
{ 
    public bool value; 

    public virtual void ChangePropertyOfAIChild() 
    { 
    value = true; 
    } 
} 

public class B : IA 
{ } 

public class C : IA 
{ } 

// in main 
IA newBInstance = new B(); 
newBInstance.ChangePropertyOfAIChild(); 

IA newCInstance = new C(); 
newCInstance.ChangePropertyOfAIChild(); 
/// 

あなたのサンプルコードは、それはおよそを知らないクラス内のフィールドの値を変更しようとする基本抽象クラスを持っていました

これを実行できるようにするには、フィールドをベースクラス内で宣言する必要があります。

+0

あなたは絶対に正しいです。ありがとうございました! –

1

あなたはあなたの継承権を持っていないと思います。

これはあなたのクラスの実装である場合:

public abstract class IA 
{ 
} 

public class B : IA 
{ 
    public bool value; 
} 

public class C : IA 
{ 
    public bool value; 
} 

そして、あなたはそのようなIAのインスタンスを作成した場合、その後:

IA newBInstance = new B(); 

を次にコンパイラは先に行くとIAのインスタンスを作成します。 IAにはvalueというプロパティがないため、アクセスできません。

前回の返信でCodexNZが提案した方法を使用するか、newInstanceBにキャストして直接valueに設定するという2つの方法があります。このように:あなたはあなたが同様に最初の場所でBのインスタンスを作成する場合がありますことを行うことができますので、もし

IA newBInstance = new B(); 
((B)newBInstance).value = true; 

しかし、これはカウンター直感的です。だから私は前の方法をお勧めします。これは、なぜ説明するより多くのですあなたのロジックが動作しません。

詳しくはチュートリアルlike thisを参照してください。インターネットにはさらに多くのリソースがあります。