4

インターフェイスとポリモーフィズムを組み合わせると混乱します。

私が次のインターフェースを持っているとしましょう:

public Interface CanSayHello
{
     String SayHello();
}

次のクラス:

public Class Person : CanSayHello
{
     public String SayHello() { return "Hey, I'm a person just saying hello to you";}
}

そして最後に重要なクラス:

public Class PoshPerson: Person
{
     public String SayHello() { return "Hey, I'm too posh to say hello to you";}
}

私の最初の質問は、次のコードがPoshClassまたはPersonClassのメソッドを収集するかどうかです。

public delegate String Collector();
event Collector CollectorEvent;
void GetMethod(CanSayHello c){CollectorEvent += c.SayHello;}

**GetMethod(new PoshPerson());**

Personクラスからメソッドを収集する場合は、Personのメソッドを仮想として宣言し、PoshPersonのメソッドをオーバーライドする必要があると思います。2つのメソッドシグネチャが等しいことを本当に望んでいます。どうにか可能ですか?

4

3 に答える 3

4

あなたの例はPersonのメソッドを実行します。に変更PoshPersonするとPoshPerson : Person, CanSayHello(以降、何も変更されないと思われるかもしれませんPerson : CanSayHello)、PoshPersonのメソッドが実行されます。

@millimooseに同意します。「コンパイル時のポリモーフィズムはあまり直感的ではないため、可能な限りメソッドを非表示にすることは避けたいと思います。」、、に変更Person.SayHelloすることをお勧めします。そうすれば、インスタンスを、、、、またはとして知っているかどうかに関係なく、現在のインスタンスタイプのメソッドが実行されます。virtualPoshPerson.SayHellooverrideCanSayHelloPersonPoshPerson

于 2012-06-24T12:31:11.007 に答える
1

私はあなたが次の線に沿ってもっと何かが欲しいと思います:

public interface ITalkable
{ 
     string SayHello(); 
     string SayGoodbye();
     etc...
}

public class Person : ITalkable
{ 
     public virtual string SayHello() { return "Hey, I'm a person just saying hello to you";} 
     public virtual string SayGoodbye() { return "Hey, I'm a person just saying goodbye to you";}
} 

public class PoshPerson: Person 
{ 
     public override string SayHello() { return "Hey, I'm too posh to say hello to you";}
     public string MakePersonSayHello() { return base.SayHello(); } 

} 
于 2012-06-24T12:45:03.200 に答える
1

例では、Personのバージョンを実行します。ここでの説明を参照してください:http://msdn.microsoft.com/en-us/library/aa664593 (v = vs.71).aspx 。派生クラスでメソッドを再定義し(コンパイルされたものは、それを再定義するためにnewを使用したかのようにPoshPerson.SayHelloを扱います)、基本クラスがインターフェイスを実装する場合、再定義されたメソッドはインターフェイスマッピングを変更しません。

PoshPersonにインターフェースを再実装させると、PoshPersonのSayHelloが呼び出されます。

public class PoshPerson : Person, CanSayHello
{
    public String SayHello() { return "Hey, I'm too posh to say hello to you";}
}

または、SayHelloをPersonで仮想化し、PoshPersonでオーバーライドすると、PoshPersonのSayHelloが呼び出されます。

于 2012-06-24T12:37:29.093 に答える