2013-06-27 8 views
0

Я определяю интерфейс для обработки различных типов источников ввода, таких как CSV-файлы, таблицы SQL и т. Д., Чтобы я мог легко копировать данные из одного в другой. Чтобы добиться этого, у меня есть интерфейс для читателя и один для писателя. Поскольку у них есть некоторые общие атрибуты, я хотел бы определить абстрактный интерфейс ICommonContainer.Абстрактный интерфейс

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

Итак, есть ли способ объявить интерфейс неполным, похожим на абстрактный класс?

Так интерфейсы выглядит следующим образом:

public interface ICommonContainer 
{ 
    public void foo(); 
}; 

public interface Reader extends ICommonContainer 
{ 
    public data read(); 
}; 

public interface Writer extends ICommonContainer 
{ 
    public void write(data objects); 
}; 

, где читатель и писатель должен быть полным, но база не является.

+0

Вы изменили имя базового интерфейса. Либо сделайте это 'ICommonContainer', либо' Base'. –

+0

* вздох *, это просто концепция, но я изменил имена, независимо от того ... – Devolus

ответ

2

Нет такой вещи, как Abstract interface. Мы делаем абстракцию класса, чтобы сделать его недействительным. И любой интерфейс по своей природе является неинтуитивным.

Что касается вашей проблемы, вы можете сделать свой класс реализованным любым количеством интерфейсов. В вашем случае, поскольку ваши интерфейсы являются частью одной и той же иерархии наследования, вам не нужно реализовывать интерфейс Base, а также интерфейс Reader или Writer. Таким образом, пусть это реализует интерфейс Reader или Writer.


С другой стороны, если вы хотите, чтобы сделать класс, который реализует только ICommonContainer интерфейс, не-instatible, просто сделать этот класс abstract. Этого будет достаточно.

public abstract class SomeClass implements ICommonContainer { 
    // Either define the method in interface or leave it. 
} 

Как и в приведенном выше примере, ваш SomeClass не может быть реализован, как это определено абстрактно.

+0

Думаю, именно так я и должен был бы это сделать. С точки зрения дизайна я мог бы, конечно, сделать это, но это не мешает другим сделать такой класс не абстрактным и создающим его. Это немного неполно, что я не могу указать интерфейсы как неполную IMO. – Devolus

+0

@Devolus. Ну, нет способа предотвратить реалистичный класс реализации. Это не под вашим контролем. –

1

общий интерфейс контейнера является неполной, так как он определяет только подмножество, поэтому я решил, что, если добавить абстрактное, оно не должно быть instantiatable, когда применяется к классу, но она есть.

Нет, вы не можете создать экземпляр интерфейса.

И нет, нет способа предотвратить использование некоторыми классами этого интерфейса.

Это ваша работа, чтобы реализовать Reader и Writer (Ваш пример имен с прикладными именования Java), и вы не должны выполнять Base.

+0

Я обращался к классу, реализующему интерфейс. Я знаю, что я не могу создать экземпляр интерфейса. – Devolus

1

Вы можете сделать пакет интерфейса приватным, который может выполнить то, что вы хотите, но чем больше вопрос, почему?

В библиотеке Java есть много интерфейсов, которые являются «неполными»; или лучший способ объяснить это, они частично завершены. Список является одним из них.

Список можно считать частично полным, потому что вам обычно требуется нечто большее.Например, упорядочение (ArrayList) или обеспечение быстрого вставки (LinkedList). Конкретные классы заботятся о полноте.

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

+0

Почему «Список» и неполный интерфейс? – jlordo

+0

Почему это противоречит принципам дизайна? – Devolus

1

Нет, вы не можете объявить абстракцию интерфейса.

И вы не можете помешать миру иметь класс, который реализует вашу интуицию и не является абстрактным (если он общедоступен).

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

0

У вас может быть «частичный» интерфейс, связанный с чтением, а другой для записи и другой интерфейс для «отсутствующих» функций. Каждый пользователь вашего конкретного класса затем передаст его в требуемый интерфейс.

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