2014-08-29 5 views
2

Я работаю в C#, пытаясь реализовать 2 класса, которые используют один и тот же интерфейс. Для обоих классов требуется только один метод. Однако эти два метода должны быть разных типов, принимая разные параметры. Мне бы очень хотелось, чтобы унаследовать один метод от интерфейса и перезаписать его в каждом классе, так как это было бы красиво и аккуратно (интерфейс необходим для функциональности программы (работает с инъекцией зависимостей)) К сожалению, оба класса также необходимо, так как класс отправителя электронной почты будет использоваться повторно в других программах.Различные реализации одного метода интерфейса

Я нашел решение, которое ПОЧТИ подходит моя проблема, это: Implementing methods from an interface but with different parameters

Разница, что у меня есть то, что каждый из двух моих классов должен вызвать только один метод.

Вот мой код, как он стоит (попытавшись реализовать дженерики в предыдущем решении):

interface IEmailSender<T> 
{ 
    T DoEmail(); 
} 

public class EmailGenerator : IEmailSender<MailMessage> 
{ 
    public override MailMessage DoEmail(string emailAddress) 
    { 
     MailMessage message = new MailMessage(); 
     //code to generate email message 
     return message; 
    } 
} 

public class EmailSender : IEmailSender<bool> 
{ 
    public override bool DoEmail(MailMessage message) 
    { 
     //code to send email 
     return true; 
    } 
} 

В идеале я хотел бы мой метод электронной почты отправителя недействительным, но я не против возвращая логическое значение, если оно должно иметь возвращаемое значение.

Надеюсь, что это имеет смысл, я буквально просто стараюсь быть аккуратным здесь, потому что в настоящее время, чтобы заставить его работать, мне нужно будет иметь два метода в моем интерфейсе и каждый класс вызовет пустой метод.

Спасибо заранее,

+6

Не могли бы вы объяснить, почему эти два класса должны «разделять» один и тот же интерфейс? Кажется, они не делают подобных вещей, не так ли? –

+0

Я изначально хотел, чтобы один «электронный» интерфейс обрабатывал оба класса, которые занимались электронной почтой. Если нет способа сделать это, тогда мне придется их разделить. –

ответ

1

Похоже, вы боретесь из-за плохой архитектуры. EmailGenerator не является IEmailSender. Нет никакого случая, если вы будете использовать его как IEmailSender.

Я рекомендовал бы это:

interface IEmailGenerator{ 
    MailMessage BuildMailMessage(string message) 
} 

interface IEmailSender 
{ 
    void SendEmail(string message); 
} 

public class EmailGenerator : IEmailGenerator{ 
    public MailMessage BuildMailMessage(string message) 
    { 
      return new MailMessage(); 
    } 
} 

public class EmailSender : IEmailSender 
{ 
    private readonly IEmailGenerator _emailGenerator; 

    public EmailSender (IEmailGenerator emailGenerator){ 
     _emailGenerator = emailGenerator; 
    } 

    public void SendEmail(string message) 
    { 
      var message = _emailGenerator.BuildMailMessage(message); 

      //send email 
    } 
} 

Таким образом, вы четко разделены на разницу (и проблемы) между отправкой по электронной почте и Генерирование e-mail. Вы можете использовать DI для соединения всего:

class Consumer{ 
    private IEmailSender _emailSender; 

    Consumer(IEmailSender emailSender){ _emailSender = emailSender;} 

    void Method() 
    { 
     string msg = "Hello Wolrd!" 
     _emailSender.SendEmail(msg); 
    } 
} 
+0

Хорошо, спасибо большое. Я подумал, что невозможно превратить оба в один интерфейс! Я посмотрю, как это происходит. –

Смежные вопросы