2013-05-20 4 views
11

У меня есть раздел моего кода, где некоторые классы реализуют интерфейс.Аннотация класс и интерфейс вместе?

Он чувствует себя правильно, но между дочерними классами существует небольшое дублирование, а именно 3 метода.

Так что это кричит, чтобы использовать абстрактный класс.

Мой вопрос, будет ли какие-либо недостатки в использовании как абстрактный класс и интерфейс в следующих ситуациях:

  1. Абстрактный класс для реализации интерфейса и дочерние классы для расширения абстрактного класса
  2. классы по уходу за детьми расширить абстрактный класс и реализовать интерфейс

Или

Должны ли абстрактные классы и интерфейсы не использовать вместе вообще так?

+1

Нет причин, по которым они не должны быть –

+2

Nop, совсем нет. На деле большая часть того, что я делаю, точно такая. –

ответ

16

Совершенно нормально использовать эти два вместе. Рассмотрим, например, AbstractList (с использованием List) и AbstractMap (реализация Map) в JDK.

Моей реакция рефлекторной бы иметь абстрактный класс реализует интерфейс, а затем конкретные классы происходят из него:

abstract class Base implements TheInterface { 
    /* ...shared methods... */ 
} 

class Concrete1 extends Base { } 

class Concrete1 extends Base { } 

Но ваш вопрос поднимая другую возможность заставил меня думать, и я не может видеть большую часть аргумента против делать это таким образом:

abstract class Base { 
    /* ...shared methods... */ 
} 

class Concrete1 extends Base implements TheInterface { } 

class Concrete1 extends Base implements TheInterface { } 

Кроме того, я могу увидеть аргумент для делать это таким образом, в частности, что она удаляет связь между абстрактным с ласс и интерфейс. Если у вас есть другой класс, которому нужна функциональность Base, но не необходимо реализовать интерфейс, у вас есть возможность сделать это.

Существует также третий вариант: Состав. Вы не могли бы иметь абстрактный класс вообще, а есть несколько конкретных классов, которые реализуют интерфейс использования общий вспомогательный класс в их реализации:

class Helper { 
    /* ...shared methods... */ 
} 

class Concrete1 implements TheInterface { 
    /* ...uses instance of Helper */ 
} 

class Concrete1 implements TheInterface { 
    /* ...uses instance of Helper */ 
} 

Это имеет ту же гибкость, и в другой форме.

1

Я не думаю, что существует такое эмпирическое правило. При проектировании старайтесь следовать принципам SOLID, чтобы выяснить, хорошо ли это или плохо. Вы можете найти эти принципы за here. В этом конкретном случае я бы подумал, что вы должны убедиться, что соблюдаете «Принцип открытого закрытия».

0

Лично я предпочитаю утверждение, что абстрактный класс является фоном для других классов, поэтому, если у трех других классов есть что-то общее, их общий предок, абстрактный класс, созданный только для этих трех других классов, должен также содержать код из интерфейс. Это сделало бы абстрактный класс «полным» (на его пути), обеспечивающим все эти свойства и методы, которыми разделяют три класса.

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

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