2015-09-25 3 views
1

У меня есть вопрос относительно структуры моих классов в Java:как избежать использования пустого метода реализации?

У меня есть первый класс: MyClass, который является абстрактным

public abstract class MyClass 
{ 
    protected void abstract monitor(); 
} 

то у меня есть абстрактный итератор на нем

public abstract class MyClassIterator<T> extends MyClass 
{ 
    protected void abstract monitor(T data); 
} 

На практике я буду создавать классы, которые либо наследуются от MyClass, либо MyClassIterator.

Я хочу, чтобы убедиться, что все экземпляры MyClass реализации монитора, но для итераторов те, как я могу избежать вставляя что-то вроде

protected void monitor() {}; 

просто реализовать:/

Спасибо за любую идею:)

+1

Имеет ли 'MyClassIterator' ** ** расширение' MyClass'? – Mena

+0

Это не в вашем распоряжении. Реализация класса может иметь любую реализацию или пустой блок кода, как вы сказали 'protected void monitor() {};' – rajuGT

+0

@Mena: это хороший вопрос, в настоящее время это то, что было сделано, поскольку MyClass определяет методы, которые будут также использоваться в итератор, поэтому нам нужно будет дублировать код в противном случае: S – Orpheo

ответ

1

Если вы не хотите, чтобы подклассы MyClassIterator должны были реализовать этот метод, вам необходимо добавить пустую реализацию в MyClassIterator. Вы также можете внести некоторые исключения в реализацию.

public abstract class MyClassIterator<T> extends MyClass 
{ 
    protected abstract void monitor(T data); 

    protected void monitor() { 
     //optional 
     throw new UnsupportedOperationException(); 
    } 
} 

Примечание: Вы не можете написать void перед тем abstract, что вам нужно, чтобы исправить это в методе monitor(T data), как в моем ответе.

+0

Действительно, все в порядке, не супер, но исправляет все проблемы :) – Orpheo

2

Добавить реализацию по умолчанию monitor в MyClass, с настраиваемым исключением

public abstract class MyClass 
{ 
    protected void abstract monitor() 
    { 
     throw new NotImplementedException(); 
    } 
} 

Таким образом, MyClassIterator не потребуется реализовать метод, а другие подклассы MyClass должны будут переопределить его.

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