2

基本クラスと 2 つの派生クラスがあります。派生クラスの 1 つを保持できる基本クラスの変数があります。その変数を、派生クラスを受け取るメソッドに送信したいと考えています。

変数が何を保持するかわからないため、明示的なキャストなしでこの問題を解決するにはどうすればよいですか?

コード:

Class A{ 
    virtual public void foo1() {/.../}
}
Class B : A{
    override public void foo1() {/.../}
}
Class C : A{
    override public void foo1() {/.../}
}
Class D{
   public foo(B argB) {/.../}
   public foo(C argC) {/.../}   

// in main
D varD = new D();
A varA = new B();   

varD.foo(varA); //--->> Problem here need explicit casting
A varC = new C();
varD.foo(varC);  //--->> Problem here need explicit casting

送信先の派生クラスがわからずvarD.foo、さまざまな派生クラスのさまざまな処理が必要です。私に何ができる?

4

2 に答える 2

3

これはポリモーフィズムとは異なります。明示的にキャストする場合でも、特殊なクラスが期待される場所に基本クラスを渡すことはできません。ポリモーフィズムは別の方法で機能します。基底クラスが期待される場所ならどこでも特殊なクラスを渡すことができます。

あなたがすべきことはD.foo期待することAであり、あなたは自動的にうまくいくでしょう. BまたはCに基本実装がないメソッドを追加する場合はA、とにかく渡す必要があり、またはにBキャストできません。ABD

于 2013-01-24T15:53:16.807 に答える
2

fooの抽象インスタンス メソッドを作成し、とAの実装をオーバーライドするだけです。クラスを維持して実際の作業をそこに委任することもできますが、これが良い考えかどうかによって異なります。BCD

への委任を含むコードを次に示しますDfoo1()また、すべてのクラスでメソッドを省略したことに注意してください。

public abstract class A
{ 
    public abstract void foo(D d);
}

public sealed class B : A
{
    public override void foo(D d)
    {
        d.foo(this);
    }
}

public sealed class C : A
{
    public override void foo(D d)
    {
        d.foo(this);
    }
}

public sealed class D
{
   public void foo(B b) { [...] }
   public void foo(C c) { [...] }   
}

これで、仮想メソッド ディスパッチを使用して正しいメソッドを呼び出すことができます。

D d = new D();

A b = new B();   
A c = new C();

b.foo(d); // Calls B.foo(D) and in turn D.foo(B).
c.foo(d); // Calls C.foo(D) and in turn D.foo(C).
于 2013-01-24T15:53:49.520 に答える