5

渡すオブジェクトのタイプに基づいて異なるプロセス メソッドを実行する必要があるクラスに取り組んでいます。ここでオーバーロードが機能する可能性があると思いましたが、質問があります。2つのインターフェースがあるとしましょう:

public interface IEmail 
{
      Some properties ...
}

public interface ISpecialEmail : IEmail
{
     Some more properties....
}

これらのオブジェクトを処理するクラス:

 public class EmailProcessor
 {

      public void ProcessEmail (IEmail email)
      {
           do stuff;
      }

      public void ProcessEmail (ISpecialEmail email)
      {

          do different stuff
      }
 }

私の質問は、ISpecialEmail が IEmail から継承されているということですが、これらのメソッド シグネチャはオーバーロードを可能にするほど十分に異なっているのでしょうか? 私の当初の考えでは、技術的にはそのインターフェイスも実装されているため、ISpecialEmail 電子メールも IEmail 署名をトリガーするというものでした。

ご協力いただきありがとうございます。

4

2 に答える 2

2

C# 仕様によると (セクション 7.4.3)

「派生クラスのメソッドが適用可能な場合、基本クラスのメソッドは候補ではありません」

public void ProcessEmail (ISpecialEmail email)ISpecialEmailは、 anが渡された場合に呼び出される関数である必要があります。IEmailただし、優先順位が変わるため、 an にキャストする場合は注意してください。IEmail両方のタイプのすべての電子メールを処理のためにいずれかの に結合する場合、ISpecialEmailそれらはすべて関数のバージョンを通過します。ListIEmailIEmail

于 2013-06-20T16:24:07.547 に答える
2

メソッドの呼び出し方法によって異なります。

たとえば、 と があるEmail : IEmailとしSpecialEmail : ISpecialEmailます。メールのリストを宣言した場合:

List<IEmail> emails = new List<IEmail> {new Email(), new SpecialEmail()};

そして走った

foreach (var email in emails) { EmailProcessor.ProcessEmail(email) }

両方public void ProcessEmail (IEmail email)を呼び出します- コンパイル時に呼び出しバインディングが発生するためです (つまり、希望どおりに動作しません)。

次のようなことをした場合も失敗します。

var email = GetEmail(); // returns either IEmail or IExtendedEmail
EmailProcessor.ProcessEmail(email); // Would ONLY call ProcessEmail(IEmail)

したがって、これらの署名ではポリモーフィズムは失敗します。

ただし、次の場合は機能します。

var email = GetEmail(); // returns only IEmail
var extendedEmail = GetExtendedEmail(); // returns only IExtendedEmail
EmailProcessor.ProcessEmail(email); // Would all ProcessEmail(IEmail)
EmailProcessor.ProcessEmail(extendedEmail ); // Would call ProcessEmail(IExtendedEmail)
于 2013-06-20T16:21:31.097 に答える