Mik*_*ike 5 c# overloading interface
我正在研究一个需要根据我传入的对象类型运行不同进程方法的类.我认为重载可能在这里工作,但我有一个问题.可以说我有两个接口:
public interface IEmail
{
Some properties ...
}
Run Code Online (Sandbox Code Playgroud)
和
public interface ISpecialEmail : IEmail
{
Some more properties....
}
Run Code Online (Sandbox Code Playgroud)
以及处理这些对象的类:
public class EmailProcessor
{
public void ProcessEmail (IEmail email)
{
do stuff;
}
public void ProcessEmail (ISpecialEmail email)
{
do different stuff
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,由于ISpecialEmail继承自IEmail,这些方法签名是否足够不同以允许重载?我最初的想法是,ISpecialEmail电子邮件也会触发IEmail签名,因为从技术上讲,该接口也是实现的.
谢谢你的帮助.
这取决于您如何调用这些方法。
例如,假设您有Email : IEmail和SpecialEmail : ISpecialEmail。如果您声明了电子邮件列表:
List<IEmail> emails = new List<IEmail> {new Email(), new SpecialEmail()};
Run Code Online (Sandbox Code Playgroud)
然后就跑了
foreach (var email in emails) { EmailProcessor.ProcessEmail(email) }
Run Code Online (Sandbox Code Playgroud)
它将同时调用public void ProcessEmail (IEmail email)两者-因为调用绑定发生在编译时(即它不会按您想要的方式工作)。
如果您执行以下操作,它也会失败:
var email = GetEmail(); // returns either IEmail or IExtendedEmail
EmailProcessor.ProcessEmail(email); // Would ONLY call ProcessEmail(IEmail)
Run Code Online (Sandbox Code Playgroud)
因此,多态性将因这些签名而失败。
但是,以下方法可行:
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)
Run Code Online (Sandbox Code Playgroud)