Абстрактный класс, какой конкретный класс использовать?Вопрос дизайна? - PullRequest
2 голосов
/ 24 ноября 2011

У меня проблема с дизайном. Я изменяю существующий код и где я создавал новый класс. Это дает мне ошибки из-за превращения класса в абстрактный класс, который я могу понять. Выдает ошибку, потому что вы не можете создавать экземпляры абстрактного класса.

У меня был этот код ниже

ExampleProcessor pro = new ExampleProcessor();

но класс ExmapleProcessor теперь превращен в абстрактный класс.

public abstract class ExmapleProcessor {
  public abstract void Method1();
  public abstract void Method2();
}

Дочерние классы AExampleProcessor и BExampleProcessor.

public class AExampleProcessor : ExampleProcessor 
{  
  public override void Method1()  { //do something }
  public override void Method2()  { //do something }
}

public class BExampleProcessor : ExampleProcessor 
{
  public override void Method1()  { //do something }
  public override void Method2()  { //do something }
}

Таким образом, эта строка вызывает 42 ошибки "ExampleProcessor pro = new ExampleProcessor ();" везде в моем приложении.

Я не хочу делать

AExampleProcessor pro = new AExampleProcessor();

и

BExampleProcessor pro = new BExampleProcessor();

потому что я хочу, чтобы мое приложение решало, какой класс использовать. Как я могу сделать так, чтобы он загружал правильный класс?

Я хотел бы получить примеры кода, пожалуйста ..

Ответы [ 2 ]

7 голосов
/ 24 ноября 2011

Создать фабрику:

public static class ExampleProcessorFactory
{
   public static ExampleProcessor Create()
   {
       if(IsFullmoon)
           return new ExampleProcessorA();
       else
           return new ExampleProcessorB();
   }
}

Затем замените все вызовы на new ExampleProcessor() вызовами на ExampleProcessorFactory.Create().Теперь вы инкапсулировали логику создания и выбор конкретного класса для создания экземпляра в одном месте, где вы можете применить любую логику, чтобы решить, какой класс создать.(Логика принятия решения, когда использовать, какой класс может извлечь выгоду из некоторого улучшения, не связанного с полной луной.)

2 голосов
/ 24 ноября 2011

Поскольку вы хотите, чтобы приложение решало, какой конкретный подкласс использовать, я предлагаю вам использовать шаблон Factory.
Таким образом, клиентский код знает только то, что вы используете ExampleProcessor, а детали реализации остаются скрытыми.

...