5

我正在研究一个需要根据我传入的对象类型运行不同处理方法的类。我认为重载可能在这里起作用,但我有一个问题。假设我有两个接口:

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

这取决于您如何调用这些方法。

例如,假设您有Email : IEmailSpecialEmail : 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 回答
2

根据 C# 规范(第 7.4.3 节)

“如果派生类中的任何方法适用,则基类中的方法不是候选方法”

public void ProcessEmail (ISpecialEmail email)应该是在ISpecialEmail传入 an 时调用的函数。但是要小心将其转换为 an IEmail,因为这会改变优先级。如果您将所有类型的电子邮件合并IEmailISpecialEmail其中一个ListIEmail进行处理,它们都将通过IEmail函数的版本。

于 2013-06-20T16:24:07.547 回答