АбстрактЗавод с изюминкой - PullRequest
1 голос
/ 29 июня 2011

У меня возникла проблема с программированием:

У меня есть два Java проекта в моей Eclipse IDE: ProjectA и ProjectB.ProjectB ссылается на ProjectA

Я объявил класс в ProjectA: ClassA и один в ProjectB: ClassB, так что:

public class ClassA{
  public static Object foo(){
   //blah
  }
}

public class ClassB extends ClassA{
  public static Object foo(){
    //blah
  }
}

У меня также есть класс с именем ClientClass в ProjectA.Этот ClientClass ранее использовался для создания экземпляра ClassA и его использования.Но теперь, основываясь на настройке среды, в ClientClass должна быть предоставлена ​​возможность использовать ClassA или ClassB.

Кажется, это проблема для шаблона AbstractFactory, или я так думал.Мне нужно создать Фабрику, которая обеспечивает доступ к ClassA или ClassB.ClientClass не должен знать, что это ClassA или ClassB.Это требует от меня создания интерфейса для ClassA и ClassB.

Проблемы, с которыми я столкнулся :

  • ClientClass не может ссылаться на ClassB напрямую (без операторов импорта / или нового вызова), поскольку ClassB находится в другом проекте.Это может быть ограничение Eclipse IDE, но оно также имеет смысл для меня при просмотре этих двух проектов в виде jar-файлов.Циклические отношения можно избежать.
  • Я не могу создать интерфейс Factory и общий интерфейс для ClassA и ClassB, а затем через шаблон AbstractFactory предоставить ClassAFactory или ClassBFactory.Это потому, что методы, которые должны вызываться в ClassA и ClassB, являются статическими.Методы этих классов должны присутствовать в интерфейсе.Но тогда в Java не может быть модификатора "абстрактной статики"

Кто-нибудь может предложить элегантное решение этой проблемы?

Ответы [ 2 ]

2 голосов
/ 29 июня 2011

Ну, здесь есть ряд проблем. Начнем с того, что это самое главное, это не сработает, потому что вы не можете переопределить статические методы в Java. Я думаю, что цель того, что вы говорите, состоит в том, чтобы иметь возможность заменить во время выполнения ClassA на ClassB или B или A или что-либо еще, в зависимости от некоторых параметров. Для этого вам нужно иметь возможность использовать динамическую диспетчеризацию (или, проще говоря, виртуальные методы), которая позволила бы системе времени выполнения выбирать адрес памяти метода, который будет выполняться во время выполнения. Это невозможно при использовании статических методов. Вы должны сделать методы нестатическими, чтобы это работало. Вам не нужно специально разрабатывать Java Interface, но когда вы расширяете ClassA с помощью ClassB, вы сможете обрабатывать ваши объекты, как если бы они были просто объектом ClassA.

Все это говорит о том, что если вы удалите статические модификаторы из методов и сделаете их нестатическими, то вы могли бы использовать ClassB в проекте A, не имея каких-либо операторов импорта вообще в том классе клиента, о котором вы говорите. Однако где-то в проекте A кому-то понадобится знать о ClassB, чтобы создать его экземпляр. Это, конечно, если вы не хотите выполнять связывание во время выполнения и загружать класс динамически, используя строку. Имеет ли это смысл?

0 голосов
/ 29 июня 2011

Первая проблема: метод foo вашего класса B и класса A является статическим.Следовательно, ничто не переопределяется.Вам не следует делать их статичными, если вы собираетесь переопределить foo в ClassB.

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

Вопрос о том, является ли это абстрактным фактором или нет, не имеет значения.Шаблоны проектирования просто заставляют код следовать известной структуре.Это не самоцель.

Пока, почему ваш ClientClass в Project A должен знать о ClientB?

Что касается фабрики, ваша фабрика должна находиться в Проекте B, и это может быть что-то вроде:

class Factory {

публичная статическая ClassA createTheRightOne (настройки EnvironmentSettings) {// делать правильные вещи}

}

как только вы исправите статический модификатор

  • Pavan
...