당신은 이미 몇 가지 좋은 답변을 얻었지만 질문의 방에있는 거대한 코끼리는 이것입니다.
상속을 사용해서는 안된다는 누군가의 말을 듣고 대신 인터페이스를 사용해야합니다
경험상 누군가 누군가가 경험할 때 무시하십시오. 이것은 "누군가에게 무언가를 말해주는 것"뿐만 아니라 인터넷에서 물건을 읽는데도 사용됩니다. 이유 를 알지 못하면 (그리고 실제로 그것을 뒷받침 할 수있는 경우), 그러한 조언은 가치가없고 종종 매우 해 롭습니다.
내 경험상 OOP에서 가장 중요하고 유용한 개념은 "낮은 커플 링"과 "높은 응집성"입니다 (클래스 / 객체는 서로에 대해 가능한 한 적게 알고 있으며 각 단위는 가능한 한 적은 수의 책임을집니다).
낮은 커플 링
즉, 코드에 포함 된 모든 "번들"은 가능한 한 주변 환경에 의존해야합니다. 이것은 클래스 (클래스 디자인)뿐만 아니라 객체 (실제 구현), 일반적으로 "파일"(예 : #include
단일 .cpp
파일 당 s 수, 단일 파일 import
당 수 등 .java
)에 적용됩니다.
두 엔티티가 결합되었다는 신호는 다른 엔티티가 어떤 방식 으로든 변경 될 때 그 중 하나가 끊어 지거나 변경되어야한다는 것입니다.
상속은 분명히 커플 링을 증가시킵니다. 기본 클래스를 변경하면 모든 하위 클래스가 변경됩니다.
인터페이스는 커플 링을 줄입니다. 명확한 방법 기반 계약을 정의하면 계약을 변경하지 않는 한 인터페이스의 양쪽 측면을 자유롭게 변경할 수 있습니다. "인터페이스"는 일반적인 개념이며 Java interface
또는 C ++ 추상 클래스는 구현 세부 사항 일뿐입니다.
높은 응집력
이것은 각 클래스, 객체, 파일 등이 가능한 한 적게 관심을 갖거나 책임을 지도록하는 것을 의미합니다. 즉, 많은 일을하는 큰 수업을 피하십시오. 예를 들어, 무기에 완전히 다른 측면 (탄약, 발사 행동, 그래픽 표현, 인벤토리 표현 등)이있는 경우, 그 중 하나를 정확하게 나타내는 다른 클래스를 가질 수 있습니다. 주무기 클래스는 그런 세부 사항의 "홀더"로 변형됩니다. 무기 오브젝트는 그 세부 사항에 대한 몇 가지 포인터에 지나지 않습니다.
이 예에서는 "발사 행동"을 나타내는 클래스가 주 무기 클래스에 대해 인간적으로 가능한 한 적은 것을 알고 있는지 확인합니다. 최적의 것은 전혀 없습니다. 예를 들어, 이것은 손가락 하나만으로 세계의 모든 물체 (포탑, 화산, NPC 등)에 "발화 행동"을 줄 수 있음을 의미 합니다. 특정 시점에서 무기가 인벤토리에 표시되는 방식을 변경하려는 경우 간단히 그렇게 할 수 있습니다. 인벤토리 클래스 만 알 수 있습니다.
개체가 응집 적이 지 않다는 신호는 개체가 동시에 여러 방향으로 분기되어 점점 커지는 경우입니다.
당신이 묘사 할 때 상속은 응집력을 감소시킵니다. 무기 클래스는 하루 종일 무기의 모든 종류의 서로 관련이없는 다양한 측면을 처리하는 큰 덩어리입니다.
인터페이스는 인터페이스의 양면에서 책임을 명확하게 분리하여 간접적으로 응집력을 높입니다.
지금해야 할 일
여전히 단단하고 빠른 규칙은 없지만이 모든 것은 단지 지침 일뿐입니다. 일반적으로 사용자 TKK가 그의 답변에서 언급했듯이 상속은 학교와 책에서 많이 가르쳐집니다. OOP의 멋진 점입니다. 인터페이스는 아마도 가르치는 데 지루하고, (사소한 예제를 지나친다면) 조금 더 어려워서 의존성 주입 필드를 열어서 상속만큼 명확하지 않습니다.
하루가 끝날 무렵에도 상속 기반 체계는 명확한 OOP 디자인을 전혀 사용하지 않는 것보다 낫습니다. 따라서 자유롭게 고수하십시오. 원한다면 Low Coupling, High Cohesion에 대해 약간의 결론을 내릴 수 있으며 그러한 종류의 사고를 무기고에 추가하고 싶은지 확인할 수 있습니다. 나중에 원한다면 언제든지 다시 시도해 볼 수 있습니다. 또는 더 큰 차세대 코드 모듈에서 인터페이스 기반 접근 방식을 시도해보십시오.