2016-11-29 3 views
-1

Предположим, у меня есть класс Store, который является суперклассом из 3-х классов (книга, одежда, еда). Теперь я хочу добавить 2 общих метода (описание и цену), обычно во всех них, и только хочу добавить (рассчитать налог) в классе продуктов .... В основном классеКак избежать общего повторения методов при наследовании класса/интерфейсов?

Создайте массив супер-ссылок, а затем по каждой ссылке у меня разные объекты классов случайным образом, но ЧТО Я ХОЧУ, ЧТО Я НЕ ХОЧУ ИМЕТЬ (рассчитать налог) метод в Книге и одежде, я только хочу это в Пищевой ссылке (из массива).

Как достичь этой цели с помощью диспетчеризации динамических методов и интерфейсов?

Благодаря действительно

+1

Вы имеете в виду, что у вас есть три класса, расширяющих магазин, не так ли? Магазин не может распространять три класса. (Похоже, что это должен быть StoreItem или что-то подобное, тоже ... книга не является магазином.) –

+1

Далее, если вы вызываете 'calculateTax' через ссылку Store, что вы хотите, если это * не * ссылка на объект питания? –

+0

К сожалению, я исправлю его –

ответ

1

Вы могли бы написать метод по умолчанию в Store классе. Если он не переопределяется дочерним классом, он выдает ошибку только при вызове.

public interface Store { 
    default double calculateTax() { 
     throw new UnsupportedOperationException("Operation not defined for this store"); 
    } 
    ... 
} 

При определении Food вы можете переопределить этот метод:

public class Food implements Store { 
    @Override 
    public double calculateTax() { 
     // calculate tax... 
    } 
    ... 
} 

Другой альтернативой будет расширять интерфейс Store, чтобы добавить дополнительные методу

public interface Store { 
    ... 
} 

public interface TaxedStore extends Store { 
    double calculateTax(); 
    ... 
} 

Теперь, когда вы определить классы, такие как Food, вы можете реализовать t TaxedStore, и когда вы определяете такие классы, как Book, вы можете реализовать Store.

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