在C#中使用依赖接口从Abstract类继承的正确方法

时间:2015-10-23 21:12:53

标签: c# .net algorithm oop design-patterns

我有一个用于发送和检索消息的抽象类。

public abstract class MailClient
{
    public IAuthentication MailAuthentication { get; set; }

    internal MailClient(IAuthentication mailAuthenticaton)
    {
        this.MailAuthentication = mailAuthenticaton;
    }

    public abstract State SendMessage(IMessage message);
    public abstract List<IMessage> GetEmails();
}

我想创建一个具体的类(比如雅虎电子邮件消息)。因此,我创建了从抽象的Mail客户端继承的yahoo客户端,并使用包含需要发送或接收的消息的详细信息的YahooMessage对象。

public class YahooClient : MailClient
{
    private YahooConfiguration configuration = new YahooConfiguration();

    public YahooClient (string username, string password) : base(new YahooAuthentication(username, password)) 
    { 
    }

    public override List<YahooMessage> GetMessages()
    {
        //Code for retrieving emails
    }

    public override State SendMessage(YahooMessage message)
    {
        //Code for sending emails
    }
}

YahooMessage实现了IMessage接口,并添加了一些特定于Yahoo的新属性。

但是,我收到错误,因为“SendMessage”和“GetMessages”没有在Child类(YahooClient)中使用正确的签名实现。我使用YahooMessage而不是IMessage来实现IMessage接口。

这显然是错误的做法。什么是实现所需功能的合适方法?

1 个答案:

答案 0 :(得分:3)

我会将您的基类定义更改为通用。

public abstract class MailClient<TMessage> where TMessage: IMessage
{
    public IAuthentication MailAuthentication { get; set; }

    internal MailClient(IAuthentication mailAuthenticaton)
    {
        this.MailAuthentication = mailAuthenticaton;
    }

    public abstract State SendMessage(TMessage message);
    public abstract List<TMessage> GetEmails();
}

然后,这将为您提供

的实现
public class YahooClient : MailClient<YahooMessage>
{
    private YahooConfiguration configuration = new YahooConfiguration();

    public YahooClient (string username, string password) 
        : base(new YahooAuthentication(username, password)) 
    { 
    }

    public override List<YahooMessage> GetMessages()
    {
        //Code for retrieving emails
    }

    public override State SendMessage(YahooMessage message)
    {
        //Code for sending emails
    }
}