2017-01-20 1 views
-2

나는 두 개의 클래스가 있습니다. 나는이 작동하지 않습니다 때문이 아니라 그들이 할 생각 : 내가 '자료 그'에 getMax의 매개 변수를 변경한다면fullfill에 Liskov 대체 원칙

Extended d = c.getMax(b); //doesn't work 
Extended e = c.getMax(c); 

이 두 클래스는 원칙을 fullfill에겠습니까?

+1

'b'란 무엇입니까? 'c' 란 무엇입니까? – Andremoniy

+0

죄송합니다. 잃어 버렸습니다. – binaryBigInt

답변

2

Liskov Substitution Principles에서는 유형을 확장 할 때 요구 사항이 기본과 동일하거나보다 편안해야하며 약속은 동일하거나 더 엄격해야한다고 규정합니다. 이 유형의 메소드는 여기에서 우리가 조사 할 때 가장 중요합니다.

우리는 클래스의 기존 약속을 깨뜨리지 않는 한 기본 클래스에 존재하지 않는 메서드는 신경 쓰지 않습니다. 이 방법은 그렇게하지 않으므로 관련이 없습니다.

public Extended getMax(Extended that){ 
    return new Extended(Math.max(getValue(), that.getValue())); 
} 

무시하는 메소드는 정말 중요합니다. 자, 당신이 가지고있는 하나를 살펴 보자 :

public Base divide(Base that) { 
    return new Base(getValue()/that.getValue()); 
} 

@Override 
public Extended divide(Base that) { 
    return new Extended(getValue()/that.getValue()); 
} 
  • 기본 방법의 요구 사항은 유효한 Base 인스턴스가 전달되는 것을 그 getValue() 재정의 방법 0
  • 요구 사항을 반환하지 않는다는 것입니다 유효한 Base 인스턴스가 전달되고 해당 getValue()이 0을 반환하지 않는다는 것입니다.
  • 유효한 기본 메서드는 Base 인스턴스가 반환된다는 것입니다.
  • 오버라이드 메소드는 유효한 Base 인스턴스가 반환되고 그 인스턴스가 구체적으로 Extended 인스턴스라는 것을 보증합니다.

따라서 이러한 클래스로 Liskov 대체 원리를 기리고 있습니다.

당신의 조각이 컴파일되지 않는 이유는 LSP와는 아무 상관이 없습니다 :

Base b = new Base(3); 
Extended c = new Extended(4); 
Extended d = c.getMax(b); //doesn't work 
Extended e = c.getMax(c); 

하나의 getMax 방법이를 그리고 구체적으로 Extended 인스턴스를합니다. 그러나 Base 인스턴스를 전달합니다.

+0

이것이 작동하지 않는 것이 중요합니까? '확장 d = b.divide (c);'(처음 게시물에 b와 c를 추가했습니다) – binaryBigInt

+0

@binaryBigInt 그 것을 포함하도록 편집했습니다. –

관련 문제