2012-03-16 95 views
0

如何建立一個域,當你有一個基類和2個類擴展這個基類並且只有一個派生類與另一個對象有關係時。OO設計建模

例子:

public abstract class Base 
{ 
    public abstract void method(); 
} 

public class1 extends Base 
{ 
    public void method() 
    { 
     do some stuff 
    } 
} 

public class2 extends Base 
{ 
    private Class3 class3;  

    public void method() 
    { 
     do other stuff 
    } 

    public Class3 getClass3(){...} 

    public void setClass3(Class3 class3){...} 
} 

這是模型里氏破原則?我認爲是因爲與class3的這種關係,所以我們必須弄清楚如何在沒有這種關係的情況下進行建模或將此關係移動到Base。如果我有一個處理Class2的程序的一部分來處理Class3的關係,那麼我不能在沒有強制轉換爲class2的情況下使用基類。

這是否正確?

澄清...

讓我們在學習模型中思考。我們有課程和課程類。我們也可以有一個在線課程和presencial課程。在我們可能要面對的這些培訓課程中,所以成本只對原生態環境有意義。 CourseClasses可以有範圍日期或定量日期。

今天我有這樣的模式:

Course 
{ 
    ... 
} 

public abstract class CourseClass 
{ 
    private Course course; 

    // getter and setter to course 

    public abstract Enrollment enroll(Person student); 
} 

public class QuantitativeCourseClass 
{ 
    public Enrollment enroll(Person student) 
    { 
     // enroll for quantitative 
    } 
} 

public class RangeCourseClass 
{ 
    public Enrollment enroll(Person student) 
    { 
     // enroll for range 
    } 
} 

現在我不得不面對成本和到此刻presencial當然對我來說並不重要,但現在,成本僅爲有意義presencial環境。

我的問題是:我需要在Cost模塊中處理CourseClass對象,因爲我需要courseClass的一些東西,但成本的關係與RangeCourseClass相關,因爲QuantitativeCourseClass對於非本質環境沒有意義。

關於liskov的問題是關於如何促使我的團隊在此模型中進行一些修改。

+0

你能提供一個更具體的例子嗎?據我所知,你並沒有破壞LSP。請注意,您可能正在處理Class3,但它與「Base」沒有任何關係。它仍然是一個Base對象加上其他方法。它只是取決於客戶端類是否需要「Base」或「Class2」對象 – DPM 2012-03-16 14:59:27

+0

它似乎忘記了extends關鍵字。另外,我還不確定數量和範圍的含義以及它們與成本和「先行性」的關係。你也可以在代碼中包含成本。 – DPM 2012-03-16 15:33:03

+0

你的澄清似乎沒有幫助,因爲你忘了很多事情,說明你的問題。你的對象不會從其他任何東西繼承,並且你沒有定義什麼「presencial」的意思。 – 2012-03-16 16:43:18

回答

0

我認爲你混淆了LSP的方向(Liskov Substitution Principle):LSP是(強)行爲分類,而不是強行爲超級分類。因此,LSP不符合你的例子,但對你的例子:

這個模型打破Liskov原理?我認爲是因爲這個 與class3的關係,所以我們必須弄清楚如何在沒有 這個關係的情況下進行建模,或者將這個關係移動到Base。如果我有 程序的一部分處理Class2來處理與Class3的關係,那麼我不能在不轉換到class2的情況下使用基類來處理I 。

您的模型不打破LSP。如果您有一部分程序使用了一些特別處理Class2的變量var(即零件不在Base中),您需要將var聲明爲Class2的。所以不需要沮喪。而且,LSP也保證var的行爲與Base一樣,因此不需要顯式的upcast。

1

如果class3與base沒有任何關係,那麼它不應該在base中。由於編譯器強制執行,因此不能「中斷」LSP。向下轉換不是首選,但這樣做不會中斷LSP。

繼承的目的是要有一個「是一個」的關係。貓是一種動物。豐田汽車是一輛汽車。

你說的是將豐田標誌移動到汽車級,只是因爲你想讓事情變得更簡單。這根本不是好設計。

簡而言之,將事物轉移到基類比向下轉換到特定類更糟糕。

+0

我不想把Class3的真實性移到基類上我知道這是一件壞事。我真正的問題是在「澄清」模式下(對不起,我做了我最好的例證)。成本與RangeCourseClass有關,但我需要處理CourseClass對象,在這種情況下,我需要將instanceof用於RangeCourseClass。那就是問題所在。 – Leo 2012-03-16 15:42:25

0

據我所知,如果不知道問題方面(例如幾何),就無法查看問題。所以,我無法理解你的建築的意義。例如,着名的LSP違例例如: 正方形:矩形 - 當它站在「側」時,它看起來很好。但是,當你開始使用並且放置了一些功能時,你可以看到問題。