Кто-нибудь может объяснить мне простым языком смысл использования абстрактных классов и интерфейсов? То что читаю из мануалов - мало понятно, т.к не вижу их практического использования в своих проектах.
Желательно с примерами, можно и на Java, но желательно на РНР.
0
Абстрактные классы и интерфейсы
Started by Эльказ, Jul 06 2009 08:24 AM
3 replies to this topic
#1
Posted 06 July 2009 - 08:24 AM
#2
Posted 07 July 2009 - 07:26 AM
смысл в том, чтобы абстрагироваться от конкретной реализации, во всех рабочих классах используешь интерфейсы и абстрактные классы, таким образом в любой момент можно заменить реализацию на другую, и изменить поведение. допустим коннектор к внешней системе, пишешь его интерфейс, и потом например 2 реализатора (реальный прокси к системе и имитирующий для тестов). лучше почитай про TDD, там об этом хорошо написано.
#3
Posted 07 July 2009 - 08:41 AM
Про TDD почитаю. А пример с коннектором можешь наглядный привести?
#4
Posted 07 July 2009 - 09:02 AM
простой пример.
буду именовать так, чтобы понятно было по имени что за класс
abstract class AbstractEventConnector implements EventConnectorInterface .... (какая нить дополнительная общая реализация)
class JmsEventConnector extends AbstractEventConnector .... (реализация для JMS очередей)
class DbQueueEventConnector extends AbstractEventConnector .... (реализация для RDBMS очередей)
class MockEventConnector extends AbstractEventConnector .... (реализация для тестов)
писал на скорую руку, но приблизительно так, сорри за опечатки. суть в том, что одним и тем же кодом консьюмера можно пользоваться для разных источников сообщений, соотв. его легко адаптировать и тестировать.
буду именовать так, чтобы понятно было по имени что за класс
Код
interface EventConnectorInterface {
void registerEventConsumer(EventListener listener);
void startConnection();
}
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();
}
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 user(s) are reading this topic
members, guests, anonymous users