Jump to content


- - - - -

Абстрактные классы и интерфейсы


  • You cannot reply to this topic
3 replies to this topic

#1 Эльказ

Эльказ

    PHP Specialist

  • Постояльцы
  • PipPipPipPipPipPip
  • 1,793 posts
  • Time Online: 5h 33m 54s

Posted 06 July 2009 - 08:24 AM

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

Желательно с примерами, можно и на Java, но желательно на РНР.
  • 0

#2 Ilg

Ilg

    geek

  • Root Admin
  • PipPipPipPipPipPipPip
  • 2,717 posts
  • Time Online: 17d 6h 22m 31s

Posted 07 July 2009 - 07:26 AM

смысл в том, чтобы абстрагироваться от конкретной реализации, во всех рабочих классах используешь интерфейсы и абстрактные классы, таким образом в любой момент можно заменить реализацию на другую, и изменить поведение. допустим коннектор к внешней системе, пишешь его интерфейс, и потом например 2 реализатора (реальный прокси к системе и имитирующий для тестов). лучше почитай про TDD, там об этом хорошо написано.
  • 0

#3 Эльказ

Эльказ

    PHP Specialist

  • Постояльцы
  • PipPipPipPipPipPip
  • 1,793 posts
  • Time Online: 5h 33m 54s

Posted 07 July 2009 - 08:41 AM

Про TDD почитаю. А пример с коннектором можешь наглядный привести?
  • 0

#4 Ilg

Ilg

    geek

  • Root Admin
  • PipPipPipPipPipPipPip
  • 2,717 posts
  • Time Online: 17d 6h 22m 31s

Posted 07 July 2009 - 09:02 AM

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

Код
interface EventConnectorInterface {
void registerEventConsumer(EventListener listener);
void startConnection();
}


abstract class AbstractEventConnector implements EventConnectorInterface .... (какая нить дополнительная общая реализация)

class JmsEventConnector extends AbstractEventConnector .... (реализация для JMS очередей)

class DbQueueEventConnector extends AbstractEventConnector .... (реализация для RDBMS очередей)

class MockEventConnector extends AbstractEventConnector .... (реализация для тестов)


Код
class EventConsumer implements EventListener {
private AbstractEventConnector connector;

void setConnector(AbstractEventConnector connector) {
this.connector=connector;
connector.registerConsumer(this); // для примера оставим это здесь
}

void startConnection() {
connector.startConnection();
}

void processEvent(Object o) {
System.out.println("Event received " + o.toString());
}
}

interface EventListener() {
void processEvent(Object o);
}

void productionMethod() {
AbstractEventConnector connector = new JmsEventConnector();
EventConsumer consumer = new EventConsumer();
consumer.setConnector(connector );
consumer.startConnection();
}

void testMethod() {
AbstractEventConnector connector = new MockEventConnector();
EventConsumer consumer = new EventConsumer();
consumer.setConnector(connector );
consumer.startConnection();
}


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





0 user(s) are reading this topic

members, guests, anonymous users