클래스가 서브 클래스에 대해 알아야합니까? 예를 들어 클래스가 주어진 서브 클래스에 특정한 작업을 수행해야합니까?
내 본능은 나쁜 디자인이라고 말해줍니다. 그것은 일종의 반 패턴처럼 보입니다.
클래스가 서브 클래스에 대해 알아야합니까? 예를 들어 클래스가 주어진 서브 클래스에 특정한 작업을 수행해야합니까?
내 본능은 나쁜 디자인이라고 말해줍니다. 그것은 일종의 반 패턴처럼 보입니다.
답변:
클래스의 개념에 의해 암시 된 대답은 "아니오"입니다.
처리하는 작업, 데이터 또는 관계가 모든 하위 클래스의 일부이므로 실제 유형을 확인하지 않고 수퍼 클래스에서 처리해야합니다. 또는 일부 서브 클래스에만 적용됩니다. 그런 다음 올바른 유형을 수행하려면 런타임 유형 검사를 수행해야합니다. 다른 사람이 상속 할 때마다 수퍼 클래스를 변경해야합니다 (또는 자동으로 잘못된 일을 할 수 있음). 파생 클래스의 변경 사항은 변경되지 않은 수퍼 클래스 등을 손상시킬 수 있습니다.
요컨대, 이러한 솔루션을 거부 할 정도로 일반적으로 나쁜 여러 가지 나쁜 결과가 발생합니다. 여러 서브 클래스가 동일한 작업을 수행하고 코드 중복을 피하려면 (실제로는 항상 좋은 것), 더 나은 솔루션은 모든 서브 클래스가 코드를 상속 할 수있는 중간 레벨 클래스를 도입하는 것입니다.
뿐만 아니라 해야 그것을 모르고, 단순히 수 없습니다 ! 일반적으로 언제 어디서나 수업을 연장 할 수 있습니다. 그것은 쓰여질 때 조차 존재 하지 않았던 클래스에 의해 확장 될 수 있습니다 .
일부 언어에서는 수퍼 클래스에서 클래스 확장을 제어 할 수 있습니다. 스칼라에서 클래스는로 표시 될 수 있으며 sealed
이는 동일한 컴파일 단위 (소스 파일) 내의 다른 클래스에 의해서만 확장 될 수 있음을 의미합니다. 그 서브 클래스가 아니라면 그러나, 또한 sealed
또는 final
, 서브 클래스 다음 상기 다른 클래스로 확장 될 수있다.
스칼라에서는 닫힌 대수 데이터 유형을 모델링하는 데 사용되므로 표준 Haskell List
유형은 다음과 같습니다.
data List a = Nil | Cons a (List a)
스칼라에서 다음과 같이 모델링 할 수 있습니다.
sealed trait List[+A]
case object Nil extends List[Nothing]
final case class Cons[+A] extends List[A]
그리고 당신은 보장 할 수 에만 있기 때문에이 두 하위 "클래스"존재를 List
이고 sealed
따라서 파일의 확장 밖에 할 수없는 Cons
것입니다 final
따라서 모두에서 확장 할 수 없습니다 및 Nil
입니다 object
어쨌든 확장 할 수 없습니다 수 있습니다.
그러나 이것은 특정 유스 케이스 (상속을 통해 대수 데이터 유형 모델링) 이며이 경우에도 수퍼 클래스는 실제로 서브 클래스에 대해 알지 못합니다. 그것은 더에 대한 보장의 사용자 의 List
그는의 경우 차별 않는 경우 해당 유형 Nil
과 Cons
어떤 없을 것 다른 자신의 뒤의 뒤에 진열 대안.
abstract internal
멤버를 추가하는 것입니다 .
간단한 대답은 아니오입니다.
코드를 취 성화하고 객체 지향 프로그래밍의 두 가지 기본 원칙을 강조합니다.
예, 가끔 요 예를 들어, 제한된 수의 서브 클래스가 존재하는 경우. 방문자 패턴은 이 방법의 유용성의 그림입니다.
예 : 잘 정의 된 문법의 추상 구문 트리 (AST) 노드는 Node
모든 노드 유형을 처리하기 위해 방문자 패턴을 구현하는 단일 클래스 에서 모두 상속 될 수 있습니다.
Node
물론 기본 클래스에는 하위 클래스에 대한 직접 참조가 포함되어 있지 않습니다. 그러나 매개 변수 가있는 accept
메소드가 포함되어 있습니다 Visitor
. 그리고 각 서브 클래스 당 메소드를 Visitor
포함합니다 visit
. 따라서 Node
서브 클래스에 대한 직접적인 참조는 없지만 Visitor
인터페이스를 통해 간접적으로 서브 클래스를 "인식"합니다 . 그들은 모두 그것을 통해 함께 결합했습니다.
회사의 구성 요소를 작성한 후 나중에 떠난 후에 누군가가 해당 정보를 알려야하는 경우 자신의 목적을 위해 구성 요소를 확장 할 수 있습니까?
아니!
수업과 동일합니다. 너의 본능을 믿어 봐.