2016-03-25 3 views
0

Я все еще пытаюсь понять LSP. Из того, что я понимаю до сих пор, подклассы/подтипы должны иметь возможность заменить тип Baseclass/Main, и программа должна работать без изменений.Лисков Замена Принцип - Я нарушаю его здесь?

я следующее ...

abstract class Warehouse<T> { 
     private StockLoader<T> loader; 
     private List<T> stock; 

     protected setStockLoader(StockLoader loader) { 
      this.loader = loader; 
     } 

     protected List<T> getStock() { 
      return stock; 
     } 

     public void load() { 
     stock = loader.load(); 
     } 

     abstract showStock(); 
    } 

class WheatWH extends Warehouse<Wheat> { 
    @Override 
    public void showStock() { 
     // Print stocck with getStock() returns Wheat; 
    } 
} 

class RiceWH extends Warehouse<Rice> { 
    @Override 
    public void showStock() { 
     // Print stocck with getStock() returns Rice; 
    } 
} 


    interface List<T> StockLoader<T>() { 
     public List<T> load();  
    } 

    class PlainStockLoader implements StockLoader<Wheat>{ 
     public List<Wheat> load() { 
      //Code 
     } 
    } 

    class Rice { 
     ..... 
    } 

    class Wheat { 
     .... 
    } 

Нарушает ли это LSP? Если нет, то что нарушит LSP в вышеупомянутом проекте? Кроме того, это нарушает любой другой принцип? Можно ли это улучшить каким-либо другим способом?

+0

'public void showStock() {// Печать stocck с помощью getStock() возвращает Wheat; } 'метод void не может« вернуть Wheat ». Кроме того, важно сказать нам, почему вы считаете, что этот код нарушает LSP. –

+1

Я не вижу никаких нарушений LSP. Какой аспект этого, по вашему мнению, может быть нарушением? –

+2

Есть ли причина, почему 'Склад' является абстрактным? Создание подкласса для каждого типа содержимого кажется чрезмерным, когда класс уже является общим. –

ответ

1

То, что у вас есть, выглядит отлично. Цель здесь будет иметь реализацию таким образом, что вы могли бы сделать что-то вроде:

Warehouse<Wheat> wheat = new WheatWH(); 
Warehouse<Rice> rice = new RiceWH(); 

И затем иметь возможность вызывать методы из класса Warehouse на wheat и rice независимо от подкласса они. Код, который вы до сих пор делаете, отлично, поэтому я бы сказал, что вы определенно на правильном пути.

+1

Вы, вероятно, предназначались 'Склад wheat = new WheatWH();' и т. Д. – beresfordt

+0

Справа. Отредактировал свой ответ, чтобы отразить это. – NAMS

+0

'new WheatWH ();' и 'new RiceWH ();' невозможно. Эти классы не параметризуются. –

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