나는 대부분의 사람들이 Java의 "상속"과 "조합"의 두 가지에 더 익숙하다고 생각합니다. 이 기사는 주로이 두 가지 주제에 대해 논의 할 것입니다. 내가 뭔가 잘못 쓰지 않았거나 유치하고 논쟁이 명확하지 않으면 모든 사람들이 나를 교정하기 위해 메시지를 남길 수 있습니다.
두 가지 클래스가 있다고 가정합니다 : A 와 B :
extends A는 B를 상속 받고 A는 하위 클래스이고 B는 부모 클래스 이며이 경우 상속입니다.우리는 보통이 두 가지를 고려하는 상황을 다시 생각해보십시오. 나는 그것에 대해 간단히 생각했고 종종 다음과 같은 시나리오가 있습니다.
abstract class 또는 interface 추출됩니다. 그것에 대해 생각한 후에, 실제로이 두 가지 상황 만있는 것처럼 보이지만이 두 상황에는 특별한 관계가 있습니다. 예를 들어, 공개 코드 는 실제로 abstract class 와 interface (Java 8의 기본 메소드)에 의해 달성 될 수 있습니다.
글쎄, 너무 말도 안되는 말을 한 후, 나는 단지 내 관점을 던질 것이다. 오신 것을 환영합니다 :
abstract class 또는 interface 추출하십시오. 보다 일반적인 예 : 실제 프로젝트에서 우리는 종종 POJO 또는 model 정의하며 이러한 모델은 종종 동일한 명사 및 유형의 속성을 다음과 같이합니다.
// db table primary keyprivate int id; 매우 일반적이지만 실제 작업에서 많은 동료를 만났습니다. 이 시스템은 BaseModel 또는 RootModel 이름의 클래스를 정의하고 위의 속성 id 넣은 다음 전체 프로젝트의 모든 모델 이이 Basemoddel 클래스를 상속합니다. 그런 동료들을 만난 적이 있는지 궁금합니다. 이와 같은 글쓰기의 이점과 단점은 무엇입니까?
먼저 이점에 대해 이야기합시다. 어떤 이점을 가져올 수 있는지 말해야한다면 키보드를 몇 번 입력하고 서브 클래스에서 이러한 속성을 누락하는 것 외에는 실질적인 이점이 없습니다. 그러나 프로젝트의 후속 유지 보수에 매우 번거로운 일이 발생했습니다.
그런 다음이 글의 잠재적 인 문제에 대해 이야기 해 봅시다.
언젠가는 몇 가지 이유로 프로젝트에서 서브 클래스 A (베이스 모드 상속)에서 속성
id어디에서 사용 해야하는지 찾고 싶습니다.
당신은 똑똑하고 능숙하게 사용되는 IDE에서 find usages 으며, 많은 사용 위치를 찾았으며 많은 사람들이 당신이 전혀 관심이없는 것이 아니라는 것을 알게 될 것입니다. 그러나 방법은 없습니다. 또한 Basemodel을 상속하는 다른 클래스의 속성 ID의 사용 위치를 검색했습니다. 프로젝트가 크지 않으면 능력이 적을 수 있습니다. 프로젝트가 조금 더 커지면 어떻게해야합니까? 검색 능력이 50 이상이면 다음에 무엇을 하시겠습니까?
이 상황을 피하는 방법? 즉, 이와 같은 BaseModel 사용하여 속성 상속을 사용하지 마십시오. 물론, 엄격한시기를 위해서도 여전히이 의미를 자세히 설명해야합니다. 나는 속성 상속에 완전히 반대하지 않습니다. 명확히하자 :
내가 반대하는 것은 전체 프로젝트의 모든 모델이베이스 모델을 물려받은 다음 공통 속성을베이스 모드에 넣는 것입니다.
이 아이디어는 전체 프로젝트를위한 것임을 주목하는 것입니다.
나는 개인적으로 위의 부정적인 교과서의 예를 종종 만나기 때문에 별도로 이야기 할 것입니다. 이것이 당신의 프로젝트에서 일어 났는지 확실하지 않습니다. 어쨌든, 나는 여러 번 동료들에 의해 속임수를 썼습니다.
"조합"및 "상속"과 관련된 다른 일반적인 실수에 관해서는, 나는 아직 그것에 대해 생각하지 않았습니다 (적어도 아무도 그것을 만들지 않을 것이라고 생각합니다). 미래에 명확하게 생각하거나 독자가 다른 제안을한다면 의사 소통을 위해 메시지를 남길 수 있기를 바랍니다.