어느 것이 가장 좋은 것이 아니라 무엇을 사용해야할지는 중요합니다.
'정상적인'경우에는 간단한 질문만으로 상속 또는 집계가 필요한지 알 수 있습니다.
- 새 클래스 가 원래 클래스와 다소 차이가있는 경우 상속을 사용하십시오. 새 클래스는 이제 원래 클래스의 서브 클래스입니다.
- 새 클래스 에 원래 클래스 가 있어야합니다 . 집계를 사용하십시오. 새 클래스에는 이제 원래 클래스가 멤버로 있습니다.
그러나 큰 회색 영역이 있습니다. 따라서 몇 가지 다른 트릭이 필요합니다.
- 상속을 사용했거나 인터페이스를 사용할 계획이지만 인터페이스의 일부만 사용하거나 상관 관계를 논리적으로 유지하기 위해 많은 기능을 재정의해야합니다. 그런 다음 집계를 사용해야 함을 나타내는 큰 불쾌한 냄새가납니다.
- 집계를 사용했거나 사용하려는 경우 거의 모든 기능을 복사해야합니다. 그런 다음 상속의 방향을 가리키는 냄새가납니다.
짧게 자르려면 비논리적 상황을 피하기 위해 인터페이스의 일부를 사용하지 않거나 변경해야하는 경우 집계를 사용해야합니다. 주요 변경없이 거의 모든 기능이 필요한 경우 상속 만 사용하면됩니다. 의심스러운 경우 집계를 사용하십시오.
원래 클래스의 기능 중 일부가 필요한 클래스가있는 경우 다른 가능성은 원래 클래스를 루트 클래스와 하위 클래스로 분할하는 것입니다. 그리고 새로운 클래스가 루트 클래스에서 상속되도록합니다. 그러나 비논리적 인 분리를 만들지 말고 조심해야합니다.
예제를 추가하자. 'Eat', 'Walk', 'Bark', 'Play'와 같은 메소드가있는 'Dog'클래스가 있습니다.
class Dog
Eat;
Walk;
Bark;
Play;
end;
이제 'Cat'클래스가 필요합니다.이 클래스에는 'Eat', 'Walk', 'Purr'및 'Play'가 필요합니다. 먼저 먼저 Dog에서 확장 해보십시오.
class Cat is Dog
Purr;
end;
알았어.하지만 기다려. 이 고양이는 짖을 수 있습니다. 그리고 짖는 고양이는 우주의 원리를 위반합니다. 따라서 Bark 메서드를 재정 의하여 아무것도하지 않도록해야합니다.
class Cat is Dog
Purr;
Bark = null;
end;
좋아, 이것은 효과가 있지만 나쁜 냄새가 난다. 따라서 집계를 시도하십시오.
class Cat
has Dog;
Eat = Dog.Eat;
Walk = Dog.Walk;
Play = Dog.Play;
Purr;
end;
좋아, 이거 좋다 이 고양이는 더 이상 짖지 않으며 심지어 침묵하지 않습니다. 그러나 여전히 내부 개가 필요합니다. 솔루션 3 번을 시도해보십시오.
class Pet
Eat;
Walk;
Play;
end;
class Dog is Pet
Bark;
end;
class Cat is Pet
Purr;
end;
이것은 훨씬 더 깨끗합니다. 내부 개가 없습니다. 고양이와 개는 같은 수준입니다. 모델을 확장하기 위해 다른 애완 동물을 소개 할 수도 있습니다. 물고기 나 걷지 않는 것이 아니라면. 이 경우 다시 리팩토링해야합니다. 그러나 그것은 다른 시간을위한 것입니다.