2016-06-16 6 views
0

2 개의 클래스 A와 B가 있으며 둘 다 속성 X와 Y가 있습니다. 그러나 "그들은 단지디자인 패턴 : 상속 또는 구성

상속

class A 
{ 
    public int X; 
    public int Y; 
} 

class B : A 
{ 
    public int Z; 
} 

클래스 B가없는 속성 X를 공유하고, Y., 클래스 B는 또 다른 특성, Z. 클래스 A를 가지고 있으며, B는 서로 전혀 관련이 is-a "클래스와의 관계이므로 상속을 중단합니다. 주체는 OOP입니다. 이 구성 주체를 나누기 때문에

구성

class A 
{ 
    public int X; 
    public int Y; 
} 

class B 
{ 
    public A ObjA; 
    public int Z; 
} 

클래스 B가 클래스 A에 "이-A"관계가 없습니다 OOP이다.

중복 코드가 없으면 상속 또는 구성을 사용해야하나요 (OOP의 원칙을 위반하더라도) 또는 다른 디자인 패턴이 있습니까? 개인적으로 상속을 사용하는 것은 가독성 때문에 악의가 적은 것으로 생각합니다.

+0

* 어떻게해야합니까? * : 달성 하시겠습니까? 네가 무엇을 요구하는지 이해할 수 없다. BTW, 두 번째 예제에서 B ** ** A와 has-a 관계가 있습니다. –

+0

@JBNizet 좀 더 명확하게 질문을 수정했습니다. 그게 도움이되는지 말해주세요 –

+0

솔직히 말해서, 그렇지 않습니다. 제가 올바르게 이해한다면, B는 has-a 관계를 갖지 않으므로, composition은 사용되어서는 안되며, is는 A와 연관이 없기 때문에 상속을 사용해서는 안됩니다. 그게 맞습니까? 그런 다음, 그 중 아무 것도 사용하지 마십시오. B가 A와는 완전히 무관한지 확인하십시오. 자동차에 바퀴가 달려 있고 마우스에도 마우스가 있다고해서 꼭 관련이 있어야한다는 의미는 아닙니다. 어쩌면 실제 수업으로 구체적인 예를 들었을 때 우리는 더 많은 도움을 줄 수 있습니다. –

답변

0
    (구현 세부 사항에 따라) 일부 언어의 추가 오버 헤드를 소개합니다
  1. 클래스 B는 클래스 A와 "has-a"관계가 없습니다. 따라서 "Composition"은 사용하지 않아야합니다.

  2. 디자인 한대로 OOP 상속 방법을 사용할 수 있습니다. 그것은 당신이 말한대로 OOP 원칙을 어 기지 않습니다. Class A & B는 100 % 관련이 없습니다. 그것들은 공통된 속성을 가지므로 OOP 상속 방법을 사용할 수 있습니다. OOP에는 메서드 멤버의 상속이 필요하지 않습니다. 클래스의 변경이 다른 영향을 미치지 않도록

하지만 case.You에 대한는 속성 선언을 복제해야합니다. 그것은 모두 당신이 무슨 뜻인지에 따라 달라집니다

class A 
{ 
    public int X; 
    public int Y; 
} 

class B 
{ 
    public int X; 
    public int Y; 
    public int Z; 
} 
+1

질문에 대해 논평 한 사람들에게이 시나리오에서 복제가 가장 효과적이라고 생각합니다. 감사 –

0

모든 것이 너무 추상적이어서 불분명하다고 말하는 것은 어렵지만 일반적으로 상식을 사용할 때, 상식을 사용할 때가 아니라 때가 아니라 상속을 사용해야합니다. 티.

class hasXY { 
    int X; 
    int Y; 
} 

class A : hasXY { } 
class B : hasXY { int Z } 
: A와 B는 정말 아무 관계가없는 경우

은, 그것은 아마 당신이 사용 또는 A와 B에 의해 상속되는 자체 클래스에서 일반적으로 원하는 물건, 사물을 다르게 구조화하는 것이 더 의미가 있습니다

또는 물론

class A { 
    hasXY XY; 
} 
class B { 
    hasXY XY; 
    int Z; 
} 

,이

0

"그들은 단지 특성 XY을 공유".

두 속성은 public이므로 클래스의 동작에 기여합니다. 따라서 속성이 실제로 동일하면 (의미가 같음) 이 아닌은 클래스가 서로 관련이 없다고 말합니다.그것들은 어떤 행동을 공유하기 때문에 상속이나 더 나은 구성을 사용하는 것이 합리적입니다. 대부분의 경우이를 선호해야합니다.

그러나 AB은 관련이 없으므로 같은 이름을 할당 한 동일한 유형의 관련없는 변수 일 가능성이 큽니다. 따라서 클래스 중 하나에서 속성의 이름을 바꾸면 속성과 클래스가 서로 관련이 없음을 분명히 알 수 있습니다.