2015-01-22 6 views
2

Я создаю сетку на основе игры.Могу ли я иметь пустой Java-класс?

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

Только вопрос, мой класс AObstacle не специализируется. Все необходимые ему методы находятся в пределах ALifeForm.

Могу ли я иметь пустой класс? Плохая практика программирования? И если да, что я могу реализовать вместо этого?

+3

«Могу ли я иметь пустой Java-класс?» - Да. – Maroun

+2

Что случилось, когда вы попробовали? –

+5

Тогда почему 'ALifeForm' является' abstract', так как это подклассы ничего не предоставляют? –

ответ

6

Конечно ...

class AObstacle { } 

(плюс то, что наследование модели вы используете.) Там ничего не мешает вам делать это.

Помните, что класс на самом деле не вещь, которую вы определяете. A тип есть. Класс - это просто конструкция языка/синтаксиса, используемая для описания типа. Если описываемый тип не имеет атрибутов или операций, кроме модели наследования, то к нему нечего добавить.

Хотя вы добавляете одно. Вы даете ему имя. Это не похоже на много, но определение семантической концепции с конкретным именем (особенно в статически типизированной среде) - это очень. Теперь у вашего типа есть идентификатор, отличный от других типов в системе. Если к ним добавятся вещи позже, есть место, чтобы добавить их без рефакторинга и нарушения.

+2

И хотя пустые классы, которые наследуются от абстрактного класса, вероятно, являются запахами кода, иногда они являются лучшим способом описания структур, которые вы хотите моделировать. Судя по описанию сценария в вопросе, это похоже на такой случай с одним небольшим предостережением: препятствие действительно является формой жизни? Возможно, «ALifeForm» следует переименовать в «AGridItem» или что-то подобное, которое охватывает как живые существа, так и неодушевленные препятствия. – biziclop

+0

@biziclop: Очень верно. Мы действительно не знаем достаточно о том, чтобы модель была смоделирована, чтобы быть уверенным. Это может быть нарушением замены Лискова в качестве проектного рассмотрения, полностью отделяемого от того, поддерживает ли язык пустые классы. – David

0

Для этого вам не нужно иметь абстрактный класс и класс, который его расширяет, или пустой класс (, который тоже возможен).

Первый способ:

Вам просто нужно реализовать два класса: класс, который содержит методы и переменные, которые нужно использовать, а второй Calss, который имеет экземпляр первого класса:

public class A{ 
    public void firstMethod(){ 
    //do your stuff here 
    } 
.... 
} 

public class B{ 
    public static void main(String[] args) { 
    A a=new A(); //instantiate your class here 
    a.firstMethod();// then just use its methods 
    } 
} 

Поскольку, если вы реализуете класс, который расширяет абстрактный класс, он должен реализовать все его методы.

Второй способ:

  • Или, если вы хотите, чтобы ваш второй класс специализироваться вы могли бы:

ваш первый класс которым не должно быть абстрактным и второй можно расширять его и использовать все его методы и иметь свои конкретные методы

+0

Хотя это технически правильно, это не всегда хорошая практика. – biziclop

+0

@biziclop Да, правильно, но это всего лишь способ сделать это, и серьезно я не могу понять, в чем цель всего этого! –

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