繁体   English   中英

C#继承和方法签名

[英]C# inheritance and method signatures

我正在研究一个需要根据我传入的对象类型运行不同的进程方法的类。我认为重载可能在这里工作,但我有一个问题。 可以说我有两个接口:

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签名,因为从技术上讲,该接口也是实现的。

谢谢你的帮助。

这取决于你如何调用方法。

例如,假设您有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)

根据C#规范(第7.4.3节)

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

public void ProcessEmail (ISpecialEmail email)应该是传入ISpecialEmail调用的函数。但是要注意将其转换为IEmail ,因为这会改变优先级。 如果你将所有的电子邮件, IEmailISpecialEmail这两种类型的邮件ISpecialEmail到一个IEmail List中进行处理,它们都将通过该函数的IEmail版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM