상속 및 다형성 - 사용 편의성 대 순수성

우리 팀은 프로젝트에서 객체 목록을 사용하여 모두 비슷한 방식으로 처리되어야 하는 데이터 집합에 대해 대량 연산을 수행하고 있습니다. 특히 서로 다른 객체가 이상적으로는 동일하게 작동해야 하는데, 이는 다형성을 사용하면 매우 쉽게 달성할 수 있습니다. 제가 가진 문제는 상속이 _가 있다_는 관계가 아니라 _있다_는 관계를 의미한다는 것입니다. 예를 들어, 여러 객체가 데미지 카운터를 _가져 있지만 객체 목록에서 이를 쉽게 사용하기 위해 다형성을 사용할 수 있지만, 이는 사실이 아닌 있다 관계를 암시하는 것입니다(사람은 데미지 카운터가 아니다).

내가 생각할 수있는 유일한 해결책은 상속을 사용하는 대신 암시 적으로 캐스팅 할 때 클래스의 멤버가 적절한 객체 유형을 반환하도록하는 것입니다. 프로그래밍의 용이성을 위해 is a / has a 이상을 포기하는 것이 더 낫습니까?

편집: 좀 더 구체적으로 말하자면, 저는 C++를 사용하고 있으므로 다형성을 사용하면 파생 클래스가 단일 목록 내에 있고 기본 클래스의 가상 함수에 의해 작동 될 수 있다는 의미에서 서로 다른 객체가 <동일하게 작동> 할 수 있습니다. 인터페이스를 사용하거나 상속을 통해 모방하는 것은 제가 기꺼이 사용할 수 있는 해결책처럼 보입니다.

  • 는 사용자 인터페이스 구현 적용할 수 있어야 한다고 생각해요 * 관계 (키워봤지 이것을 C # 의):
public interface IDamageable
{
    void AddDamage(int i);
    int DamageCount {get;}
}

이 기능을 구현할 수 있는 개체 수 있습니다.

public class Person : IDamageable

public class House : IDamageable

D # 39 는 다마가카운트 속성 및 메서드 및 you& 있어야 합니다 추가할 수 있도록 한 사람이 없이 서로 관련이 있는 드러낸 손상 및 집이었 일종의 계층 구조.

해설 (0)
해결책

이 사용하여 수행할 수 있는 다중 상속. 특정한 경우에 사용할 수 있습니다 (C++) 에 따라 순수 가상 클래스뿐만 인터페이스입니다. 다중 상속 문제를 만들지 않고 유효범위 / l '가질 수 있습니다. 예:

class Damage {
    virtual void addDamage(int d) = 0;
    virtual int getDamage() = 0;
};

class Person : public virtual Damage {
    void addDamage(int d) {
        // ...
        damage += d * 2;
    }

    int getDamage() {
        return damage;
    }
};

class Car : public virtual Damage {
    void addDamage(int d) {
        // ...
        damage += d;
    }

    int getDamage() {
        return damage;
    }
};

39, & # 39, 자동차, 두 사람이 이제 is-a& 즉, 그들은 인한 피해가 구현하십시오 인터페이스입니다. 순수 가상 클래스를 사용하여 (그리하여 그들은 같은 인터페이스) 가 핵심 자주 사용해야 합니다. 이 미래의 변화에 사용하면 전체 시스템을 변경하지 못하도록. 자세한 내용은 up on the 열 폐쇄 읽기 때문이다.

해설 (0)

하지만 아직 내가 필요한 경우 별도의 손상 엇회전식 동의하는 존, 클래스, 할 수 있습니다.

class IDamageable {
  virtual DamageCounter* damage_counter() = 0;
};
class DamageCounter {
  ...
};

그 후 각 클래스 멤버 함수 () 자신의 damage_counter 다마게이블 제공해야 합니다. 그러나 이 프터블 다마게이블 에로남이네 e-lab 은 각 클래스. 대신 사용할 수 있습니다.

class Damageable {
 public:
  DamageCounter damage_counter() { return damage_counter_; }
 private:
  DamageCounter damage_counter_;
};

하지만 많은 사람들이 및 다중 상속 때 부모들이 멤버 변수를 여러 안 좋아.

해설 (0)

@Kevin &gt. 일반적으로 a& # 39, & # 39 는 대해 이야기할 때, vs a& # 39, & # 39 는. # 39, re 얘기를 we& 상속 vs 컴포지션입니다.

다만, 클래스, 속성 중 하나에 아니하였으매 &gt 우마리다마가 엇회전식 파생됨 wouldn& # 39, & # 39 는 논의될 t really 측면에서 사람을 피해 counter& # 39;; 이와 관련하여 질문이요.

이 특성으로 인해 엇회전식 doesn& t # 39, 그를 통해 다양한 객체에는 손상 카운터 컬렉션으로. 예를 들어, 개인 및 차량 지정값이 둘 다 피해를 확장하지만 can& # 39, 카운터, 또는 ',', 't have a vector&lt Car&gt 사람, 또는 기타 다른 대부분의 언어에서 비슷한 &gt vector&lt 제다마가 함께 (),'. 객체 기반 클래스, 그런 다음 그들을 지지 경우 공통점을 갖고 있지만, 그런 이쪽요 can& 액세스하려면 제다마가 () ',' t # 39 일반적인 방법입니다.

그게 본질에 따라 그의 질문에 읽었어요. &quot is-a는 수 밖에 없다 ',' 내가 '와' 는 생각해서라도 것처럼 특정 객체에 &quot aren& 않더라도 같은 경우, # 39, t?

해설 (0)

지금 right&quot "; 할 수만 있다면, 장기적으로 유지할 수 있기 때문에 쉽게 이해할 수 있다면 그것은 바로 수행됨 발견하리니 체계는 나중에 누군가 시작해야 합니다.

언어에 따라, 잘 할 수 있는 옵션이 있지만, 일반적으로 가장 단순한 인터페이스 다중 상속 한다. &Quot 의해 simple"; # 39, t 되려고 할 말은 하는 인터페이스입니다 isn& 너무 심하다. 몇 가지 단순한 인터페이스와 단일 수준들과 많이 하는 게 낫다. 물론 언제나 교역 중단 및 너무 많은 인터페이스와도 이어질 가능성이 크다고 기술입니까 수준들과 &quot forgotten"; 진행했다.

해설 (0)

@Andrew &gt. 연기 (ideal) 이 이 same&quot "; 및 다형성 절대적으로 연관해제된. 다형성 손쉽게 얻을 수 있도록 어떻게 해야 합니까?

예를 들어, 그들은 모두 한 기능을 흔하다. # 39, it 's 콜 let& 아다다마가 ()'. 일을 하려면 다음과 같습니다.

foreach (obj in mylist)
    obj.addDamage(1)

그런 다음 필요한 동적 언어 또는 인컨텍스트 공통 상위 클래스 (또는 인터페이스입니다) 에서 확장하십시오 서피스를 합니다. 예:

class Person : DamageCounter {}
class Car : DamageCounter {}

foreach (DamageCounter d in mylist)
    d.addDamage(1)

그럼 '일부' 와 '자동차' 같은 사람을 치료할 수 있을 때 매우 유용한 없다.

해설 (0)

때로는 현실을 위해 이상을 포기할 가치가 있습니다. '올바르게' 상속하는 것이 큰 문제를 야기하고 실질적인 이득이 없다면 저는 잘못 상속할 것입니다. 하지만 불필요한 다중 상속은 복잡성을 증가시키고 시스템의 유지 보수성을 떨어뜨리는 원인이 될 수 있기 때문에 시간을 들여서라도 제대로 하는 것이 좋다고 생각합니다. 자신의 상황에 가장 적합한 것이 무엇인지 결정해야 합니다.

한 가지 옵션은 이러한 객체가 DamageCounter에서 상속하는 대신 Damageable 인터페이스를 구현하도록 하는 것입니다. 이렇게 하면 사람이 데미지 카운터를 가지고 있지만 데미지를 입힐 수 있습니다. (저는 종종 인터페이스가 명사보다 형용사로서 훨씬 더 의미가 있다고 생각합니다.) 그러면 Damageable 객체에 일관된 손상 인터페이스를 가질 수 있고 손상 카운터가 기본 구현이라는 것을 노출하지 않아도 됩니다(필요한 경우가 아니라면).

템플릿 경로로 가고 싶다면(C++ 또는 유사하다고 가정할 때) 믹스인을 사용하여 이 작업을 수행할 수 있지만, 잘못하면 정말 빨리 추해질 수 있습니다.

해설 (0)

다형성 does inheritance 필요 없습니다. 다형성 is what you get 구현하십시오 여러 객체에는 같은 메시지가 서명입니다 (방법) 때.

해설 (0)

일반적으로 '있다'와 '없다'에 대해 이야기할 때는 상속과 구성에 대해 이야기합니다.

음... 대미지 카운터는 파생 클래스 중 하나의 속성일 뿐이며 질문과 관련하여 라는 관점에서 논의되지는 않을 것입니다.

이걸 보세요:

http://www.artima.com/designtechniques/compoinh.html

도움이 될 수 있습니다.

@데릭: 문구에서 기본 클래스가 있다고 생각했는데, 질문을 다시 읽으니 이제 무슨 말인지 알 것 같습니다.

해설 (0)

이 질문은 정말 혼란스럽습니다 :/.

굵은 글씨로 표시된 질문은 매우 개방적이고 "상황에 따라 다릅니다"라는 답변이 있지만 질문의 맥락에 대한 정보를 많이 제공하지 않습니다. 이 문장은 저를 혼란스럽게 합니다;

모두 비슷한 방식으로 처리되어야 하는 데이터 세트

어떤 방식으로요? 집합이 함수에 의해 처리되나요? 다른 클래스? 데이터의 가상 함수를 통해?

특히, 서로 다른 객체가 동일하게 동작하는 것이 이상적일 텐데, 이는 다형성을 통해 매우 쉽게 달성할 수 있습니다.

'동일하게 동작하는 것'이라는 이상과 다형성은 전혀 무관하지 않습니다. 다형성을 사용하면 어떻게 이러한 이상을 쉽게 달성할 수 있을까요?

해설 (0)