2016-06-30 11 views
-2

を投じることなく、基本クラスを使用して私は2クラスが明示的なは

((A)myBase).i = 1; 
((B)myBase).i = 2; 

毎回(もちろん、myBaseの派生クラスには常にiが含まれていると仮定します)。

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

+6

「i」を「MyBase」に移動して完了しました –

+0

専用メソッドの実装はどうですか? – daveoncode

+0

しかし、私はMyBaseのメンバーではありません。 myBaseの派生クラスには常にiが含まれていると仮定します。全体のコンセプトが欠落しています。 – Paparazzi

答えて

4

あなたの場合 " MyBaseのすべての派生クラスはiMyBaseに属していることを示す良い表示です。当然の

​​
-1

iの値を、派生した各クラスのコンストラクタ内に設定します。これは、外ではなく、それぞれの特殊型に応じた値になるようです。派生クラスに

class A : MyBase() { 
public A(){ i = 1;} 
public int i; 
} 

class B: MyBase() { 
public B(){ i = 2;} 
public int i; 
} 
0

移動f

abstract class MyBase() 
{ 
    public abstract void f(); 
} 

class A : MyBase() 
{ 
    public int i; 

    public override void f() 
    { 
     i=1; 
    } 
} 

class B: MyBase() 
{ 
    public int i; 

    public override void f() 
    { 
     i=2; 
    } 
} 

、その後、あなたが得るものは何でもインスタンス上fを呼び出す...

MyBase x = new A(); 
x.f(); // calls "i=1" 
x = new B(); 
x.f(); // calls "i=2" 

か、あなたが好きな場合は、元の構文に近い保つために:

void f(MyBase myBase) 
{ 
    myBase.f(); // calls the one or the other depending on the actual type of myBase 
} 
0

:あなたは、基本クラスとプロパティの抽象をすることによってそれを強制することができ、

public class MyBase 
{ 
    public int i; 
} 

または多分あなたは、サブクラスでは、それがoveridableようにしたい。そして、あなたのコードはすでに動作します、myBaseの派生クラスが常に含まれていると仮定して 私

私は、この場合には、あなたのクラスの構造を変更し、01を移動するためにはるかに良いだろうを基底クラスに追加します。 少なくとも、抽象メンバiを基底クラスに定義し、開発者がその派生クラスで実装することを知っているようにします。

そうしないと、派生クラスの1つにiを実装するのを忘れてしまい、システム全体が壊れてしまうため、一定の問題が発生します。

このような1つの問題がある場合は十分ですが、ここでこの構造を受け入れると、他の場所でもやります。クラスがメンテナンスの悪夢になります。

関連する問題