생성자는 Liskov 대체 원칙을 준수해야합니까?
나는 일반적으로 내 개체 인스턴스가 Liskov Substitution Principle을 준수하는지 확인하려고 노력 하지만 사람들이 LSP가 생성자에도 적용되어야한다고 생각하는지 항상 궁금했습니다.
나는 이것을 위해 인터넷 검색을 시도했지만 어느 쪽이든 강한 의견을 찾을 수 없었습니다.
대부분의 코딩은 Ruby로되어 있지만, 때때로 내 하위 클래스 생성자가 부모 클래스와 약간 다르다는 것을 알 수 있습니다. 그들은 동일한 기본 인수 세트를 취하고 종종 추가 인수를 취합니다. 때때로 이것은 다른 클래스 메소드에서도 발생합니다.
내 머릿속에서 이것은 항상 LSP 위반처럼 느껴졌지만 다른 사람도 이런 식으로 느끼는지보고 싶었습니다.
아니요, 생성자를 사용하면 하위 유형을 처리하고 있음을 알 수 있습니다. 이를 통해 다른 매개 변수와 같은 상위 생성자에 필요하지 않은 전제 조건을 가질 수 있습니다. 이것이 대부분의 언어에서 생성자 이름이 생성되는 클래스의 이름 인 이유입니다.
a ColoredSquare
가의 적절한 하위 유형이 될 수 Square
있지만 추가 매개 변수가 필요 하다는 것을 보여주는 좋은 예입니다 color
.. 이 하위 유형과 같은 일을 할 수 없다면 훨씬 덜 유용 할 것입니다.
어떤 의미에서 생성자는 실제로 유형의 일부가 아닙니다. 해당 유형의 요소를 반환하는 함수입니다. 따라서 하위 유형에 대한 새 생성자를 정의해도 LSV가 중단되지 않습니다.
확실히 아닙니다.
생성자는 일반적으로 하위 유형에 특화되어 있습니다. 생성자에 LSP를 적용하려는 것은 하위 유형이 특정 메서드 나 멤버를 추가 할 수 없다고 말하는 것과 같습니다. 그러나 제한은 그 반대 일뿐입니다.
그리고 필립도 동의합니다. 생성자는 실제로 유형의 일부가 아닙니다 (일부 언어에서는 생성자 대신 다른 팩토리를 쉽게 사용할 수 있음). 스몰 토크 용어를 사용하면 생성자가 메타 클래스의 메서드라고 말할 수 있습니다.
여기서 LSP를 위반하지 않습니다. 클래스 메서드 (생성자 또는 다른 클래스 메서드)가 아닌 인스턴스 메서드에만 적용됩니다.
이것은 일종의 의견이 많은 질문이지만 내가 작성하는 방식은 추가 매개 변수가 기능 변경에 실제로 영향을 미치지 않는 것입니다. 즉, 내 생성자가 하위 클래스에서 추가 매개 변수를 요구할 때 표준 기능을 유지하는 것입니다 (그러나 다른 기본 작업을 수행함). 이렇게하면 ClassA = new ClassB (with some args); 그러면 기능은 내가 이것을하든 ClassA = new ClassA (); 일반적으로 일종의 Factory 방법을 사용하여 생성하므로 작동 방식이 매끄 럽습니다. 다시 말하지만 이것은 내가 일을하는 방법이며 일을하는 절대적인 올바른 방법이 아닙니다.
'developer tip' 카테고리의 다른 글
최적화가 활성화 된 상태에서이 코드가 6.5 배 더 느린 이유는 무엇입니까? (0) | 2020.11.25 |
---|---|
4가 Number의 인스턴스가 아닌 이유는 무엇입니까? (0) | 2020.11.25 |
SignalR에서 특정 클라이언트 호출 (0) | 2020.11.25 |
Internet Explorer (9)가 UserAgent에서 "Mozilla"를보고하는 이유는 무엇입니까? (0) | 2020.11.25 |
키워드 "new"는 C #의 구조체에 어떤 역할을합니까? (0) | 2020.11.25 |