2011-12-22 2 views
1

항목 목록을 선언하는 모델 추상 클래스가 있습니다. 추상에는 두 개의 추상 클래스가 있습니다. 목록에 새 항목을 추가 할 수있는 목록과 목록을 전혀 사용하지 않는 항목은 모델 추상 클래스의 다른 동작에 따라 달라집니다.이 경우 LSP (Liskov 대체품)를 위반할 수 있습니까?

목록에 항목을 추가하고 제거하는 두 가지 방법을 선언했습니다. 분명히, 내가 그 메소드를 사용하기를 원할 때마다 나는 모델 추상을 그 서브 클래스와 함께 캐스팅해야한다.

이 경우 LSP (Liskov substitution principle)을 위반할 수 있습니까? 아니면이 문제를 해결할 방법이 있습니까?

+6

일부 코드를 알려주십시오. 훨씬 더 명확해질 것입니다. –

+0

수업 상속이 여기로가는 길은 아닌 것처럼 들립니다. 파생 클래스를 투명하게 기본 클래스로 대체 할 수 있다면 상속은 거의 항상 의미가 있습니다. – helpermethod

+0

Liskov 대체 원리를 어기는 것은 결코 좋은 생각이 아니므로 이것을 정당화하기 위해서는 정말로 강력한 주장을해야합니다. – Jesper

답변

1

나는 당신이 LSP를 위반할 것이라고 생각합니다. Wikipedia page for LSP에서

(즉, 항상 당신의 친구입니다) :

"추가 공식적으로 Liskov 대체 원칙 (LSP)이 (강한) 행동 하위 유형이라는 하위 유형 관계의 특정 정의입니다"

는 "행동 하위 유형은 인수 형식 및 반환 형식의 공분산의 contravariance에만 의존 유형 이론에 정의 된 함수의 일반적인 하위 유형보다 더 강한 개념이다. 행동 하위 유형은 일반적으로 하찮게 결정 불가능하다"

LSP는 getter와 setter 메소드는 폭과 높이가 모두 존재하는 가정, 사각형 클래스에서 파생되는 광장 클래스 위반

"전형적인 예 :

귀하의 경우와 비슷합니다. Square 클래스는 폭이 높이와 항상 같다고 가정합니다. Rectangle이 예상되는 컨텍스트에서 Square 개체를 사용하면 Square의 크기를 독립적으로 수정할 수 없으므로 (또는 오히려 변형해서는 안 됨) 예상치 못한 동작이 발생할 수 있습니다. 이 문제는 쉽게 해결할 수 없습니다 : Square 클래스의 setter 메소드를 수정하여 Square 불변량을 유지 (즉, 치수를 동일하게 유지) 할 수 있다면,이 메소드는 Rectangle setter에 대한 사후 조건을 약화 (위반)합니다. 차원을 독립적으로 수정할 수 있다고 설명합니다. LSP의 위반은, 이것처럼, 또는 관행 "나는 LSP를 이해

0

LSP를 공부 없지만 병이 캐스팅 데이

항상 나쁜 (이하 최적) OO 디자인의 표시라고 마십시오. 당신은 당신이 다음 너무 일을 설정할 수있는 모델이

같은 올바른 모델로 선언합니다

자바 컬렉션 API 간다

Collection coll = new ArrayList(); 
((List) coll).set(3,"sdf"); 

는 작동하지만 단지 심하게 작성 코드는

은 offcourse

List coll = new ArrayList(); 
coll.set(3,"sdf"); 

사용 했어야 당신이 원하는 특정 유형

0

에 문제가되지 않을 수 있지만, 여기 문제가 자바는 단일 상속 및 다중 인터페이스를 가지고있는 디자인 이유를 해결하는 것이 될 수 있습니다.

하나의 클래스 만 하나의 다른 클래스를 확장 할 수 있습니다.C++에서는 그렇지 않았고 수퍼 클래스에서는 상충되는 이름이있을 수있었습니다. 다중 상속은 이론적 인 유형 문제도 일부 발생시켰다.

따라서 한면을 인터페이스로 변환하고 하나 이상의 인터페이스를 구현하는 추상 클래스에서 확장해야합니다.

Square가 Square에서 확장되고 WidthEqualsHeight를 구현하면 LSP가 유지됩니다.

관련 문제