Cristián Romo
그는 물었다 12년 전
5

사용 편의성 vs 순결을 상속 및 다형성

우리 팀은 프로젝트에서 사용하는 모든 작업을 수행할 수 있는 대용량 데이터 집합을 처리할 수 있도록 하는 열거합니다 객체에는 유사한 방식으로. 특히 다른 객체에는 act 같은 것이 될 수 있는, 매우 쉽게 다형성 통해 얻을 수 있을 것 "이라고 말했다. 내가 가지고 있는 상속 문제가 있다는 것을 알 수 있는 is a 릴레이션십 보다는 has a 릴레이션십. 예를 들어, 몇몇 객체에는 a_ _have 객체의 목록을 만들 수 있지만, 이 피해를 엇회전식 쉽게 사용할 수 있는 것 외에는 사용할 수 있는 것은, 다형성 is a 릴레이션십 wouldn& # 39, t be true. (Is 손상이 없는 사람이 a 카운터입니다.)

내가 생각할 수 있는 유일한 솔루션이므로 가지게 될 때 클래스 object type 의 멤버 반품해야 이벤트수정적절한 암시적으로 주조 의존하지 않고 출력한다. 이를 위해 이 좋은 성과를 거둘 수 있을 것이라고 포기하고 is a / has a 대가로 부드럽게를 이상적인 프로그래밍?

편집: 좀 더 구체적으로, 나는 다른 개체를 사용하여, act 를 사용하여 도왔으매 c++컴파일러는 다형성 이용하면 &quot same&quot. 있을 수 있다는 점에서 유도 클래스 (base class) 는 하나의 가상 함수 의해 운영될 목록 및 빛위에. (또는 상속을 통한 그들을 비난한다) 솔루션을 사용하는 인터페이스입니다 같다 난 기꺼이 사용합니다.

답변 10 개

  • 는 사용자 인터페이스 구현 적용할 수 있어야 한다고 생각해요 * 관계 (키워봤지 이것을 C # 의):

public interface IDamageable
{
    void AddDamage(int i);
    int DamageCount {get;}
}

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

public class Person : IDamageable

public class House : IDamageable

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

이 사용하여 수행할 수 있는 다중 상속. 특정한 경우에 사용할 수 있습니다 (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 열 폐쇄 읽기 때문이다.

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

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_;
};

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

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

@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)

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

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

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

@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?

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

당신의 질문에 대한 답을 굵은체로 매우 개방형 계시한하나님께 &quot 설정이므로 depends&quot, 예를 들어, 무릎은 doesn& # 39, t really 열거하십시오 컨텍스트입니다 관한 정보를 가능한 많이 선택할 것을 요구하고 있다. 이러한 혼란을 줄 날.

&gt >; 모든 데이터 집합을 처리할 수 있도록 하는 유사한 방식으로

어떤 방법을? 오른길로 세트 처리하는 기능? 다른 클래스? 가상 함수) 를 통해 데이터?

&gt >; 특히 할 것 같은 것이 될 수 있는, 매우 쉽게 다른 객체에는 함께 달성됩니다 다형성

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

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

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

이 슬라이드에서는:

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

도움을 줄 수 있는 길을 따라.

@ [데릭이랑] [2] : , 는 내가 말을 통해 다시 볼 수 있을 것으로 볼 수 있다는 것은 내가 지금 뭘 좀 기본 클레스 he& # 39 의 점점 dell.

[2]: https://stackoverflow.com/questions/11854/inheritance-and-polymorphism-ease-of-use-vs-purity # 11864

39 의 가치가 있는 현실적인 이상적임 it& 포기하는 경우도 있다. # 39 의 문제가 발생할 경우 it& 벽돌이날아와 &quot right&quot, 그렇게 할 것입니다. 실제 그렇게 할 수 없이, 그럼 내가 잘못된 것이다. # 39 의 가치가 있는 것이라고 생각을 자주 한다, 그렇게 할 수 있기 때문에 시간을 감안해 it& 오른쪽맞춤, 복잡성, 정보기술 (it) 기여할 수 있는 시스템이 불필요한 다중 상속 캐시-코어 기술입니까 덜 관리할 수 있습니다. 정말 맞는 # 39 의 상황에서 what& 결정해야 한다.

첫째, 이러한 객체를 인터페이스를 구현할 수 있는 유일한 '보다는' 다마게이블 약간만이라도 다마가쿤터 '에서'. 손상, 하지만 이렇게 사람이 는 엇회전식 다마게이블 있다. (내가) 로 만드는 것보다 훨씬 더 자주 groupx 인터페이스와도 감지에서 형용사 명사.) 그럼 외상때문에 일관된 손상 인터페이스입니다 다마게이블 '에' 는 기반 시스템 구축 및 표시하지 엇회전식 오브젝트에도 손상이 있는 경우 할).

가려면 라우트를 템플릿에는 사용한다고 가정할 때 c++컴파일러는 또는 이와 유사한), 이와 함께 할 수 있지만 그럴 경우 신속하게 수행됨 믹스인 추악한 정말 제대로 받을 수 있다.