2010-03-16 2 views
6

사용자 상속 시간 및 식별자 사용시기에 대한 의견이있는 사람이 있습니까?상속 또는 식별자

상속 예 :

class Animal 
{ 
    public int Name { get; set; } 
} 

class Dog : Animal {} 

class Cat : Animal {} 

식별자 예 : 어떤 상황에서

class Animal 
{ 
    public int Name { get; set; } 

    public AnimalType { get; set; } 
} 

내가 솔루션을 선호해야하고 그들에 대한 장점과 단점은 무엇인가?

/리나

+1

@stackoverflow.com/questions/269496/inheritance-vs-aggregation –

+0

@jleedev : 이것은 집계 또는 구성이 아닙니다. 적어도 엄격한 의미는 아닙니다. –

+0

흠, 천천히해야합니다. –

답변

2

상속하는 클래스 (귀하의 예제에서 고양이와 개는) 다른 인터페이스 (메소드 나 필드)이있는 경우 나, 상속을 사용하거나 다른 행동을 선택하는 데 사용하는 경우. 예를 들어, 실제 프로젝트에서 나는 HTML 코드를 생성하기위한 기본 클래스를 가지고있다. 올바른 하위 클래스를 만드는 상황에 따라 올바른 HTML을 생성합니다. 이 클래스는 (대부분) 동일한 인터페이스를 가지고 있지만, 동작이 너무 다르기 때문에 if 또는 switch를 통해 선택하려고하지 않습니다.

6

시스템에서 수행해야하는 작업 유형에 따라 다릅니다. 예를 들어, 당신은 당신이 상속을 사용하는 것보다 당신의 객체 각각에 대해 다른 방식으로 수행해야합니다 몇 가지 일반적인 액션, 예를 들어이있는 경우 : 어떤 유형과 같은 더 외모를 반대하면 다른 한편으로

class Shape 
{ 
    public abstract void Draw(); 
} 

class Circle : Shape 
{ 
    public override void Draw() 
    { 
     /* Custom implementation for Circle. */ 
    } 
} 

class Box : Shape 
{ 
    public override void Draw() 
    { 
     /* Custom implementation for Box. */ 
    } 
} 

을 그

enum Color 
{ 
    Red, 
    Green, 
    Blue 
} 

class Box 
{ 
    public Color BoxColor { get; set; } 
} 

당신은 (그러나 그렇게 좋아 보이지 않습니다) 여기에 상속을 사용할 수 있습니다 : 속성은 당신이 "식별자"로 불리는 것을 사용해야 레드 박스, BlueBox 등의 차이는 모든 상자 (심지어 사람 다른 색깔로)는 같은 방식으로 취급되며 그들의 행동은 공통적입니다.

1

코드를 사용하는 위치와 사용 방법을 살펴보십시오. 나는 당신이 다형성을위한 좋은 기회를 가진 뚜렷한 객체들을 가질 때 상속이 항상 도움이된다는 것을 발견했습니다.

가 로깅 솔루션을 생각 log(string info)를 기록하는 방법은,

내가 찾은), 네트워크 화면 등을 로그와 같은 디스크에 기록으로 그 일을 무엇으로 구별되는 개체에 상속되어야한다 당신이 진짜 수업으로 돌아가 뭔가를해야 할 때, 코드 냄새가 일고 있습니다. 당신이 그것을하고 있다면 당신은 아마도 그것을 적절하게 사용하지 않았을 것입니다.

상속은 도구 일 뿐이므로이를 사용하지 마십시오. 더 효율적으로 실행되는 명확한 코드를 작성하는 데 도움이되므로 사용하십시오.

1

상속은 주어진 식별자에 따라 동작을 변경해야 할 때 선호됩니다. 예를 들어, 단순히 Animalwalk() 메소드로 제공하려는 경우 하위 클래스를 제공 할 필요가 없습니다 (개와 고양이가 멀리에서 보인 것처럼 동일한 방식으로 진행됨). 당신이 그 (것)들을 일부 makeNoise(Mood mood) 방법을 갖고 싶어

그러나, 상속 유용 할 것입니다 : 당신이 "식별자"를 부르는

class Cat { 
    public void makeNoise(Mood mood) { 
     swithch(mood) { 
      case happy: 
       purr(); 
       break; 
       // and so on 
4

나는 열거 방식을 부를 것이다.

작은 따옴표로 열거 형을 사용하면 작고 고정 된 가능성을 구분하는 데만 적합합니다. 당신이 over-extend 할 때 당신은 스위치 문장이 당신의 코드에서 어디에나 나타나고 그것은 상속을 사용해야한다는 강력한 지시자입니다.

0

그게 faily 간단한 두 당신이 행동을 diffrent 한 이 diffrent 문제를 해결하기 위해 온, 당신은 동물 클래스의 행동이있는 경우 상속, 예를 들어, 그것은 사용하여 구현해야한다 "이야기"를 사용한다 polimorphism과 상속.

3
  • 동물 간의 유일한 차이점이 유형 인 경우 AnimalType 속성을 사용하십시오.

  • 다른 동물이 속성과 방법 또는 다른 동물의 구현이 다른 경우 Animal에서 파생되는 클래스를 만듭니다.

    동물 유형을 확인하는 것이 일반적인 경우에는 is/as의 롯트 대신에 AnimalType 속성을 제공하는 것이 좋습니다.

1

일반에서 전문으로 갈 때 나는 상속을 받았다고 말할 것입니다. 그런 식으로 (당신의 모범과 관련하여) 한 번만 걷고, 먹고, 자고, 등등의 방법을 만들어야합니다. 그러나 그들이 동일한 수준에 있다면 단순히 식별자를 사용하는 것이 낫습니다. 예를 들어. 새끼를 추가하는 것 외에도 옵션을 사용하지 않아야하기 때문에 개를 고양이로부터 떼어 내고 싶지 않을 것입니다.

2

상속은 Cat과 Dog의 동작을 Animal의 동작과 밀접하게 결합합니다. 어느 것이 당신이 원하는 것일 수 있습니다. 당신은 아무것도이 가능합니다 우주를 만들려고, 그리고 동물의 종류를 변경할 수있는 경우

그러나, 당신은 .. 식별자 방법을 사용하는

을 선호 할 수 있습니다하지만 당신이 더 걸릴 수 있습니다.

에 따르면 Gang of Fours design patterns 당신이해야

" '클래스 상속'을 통해 찬성 '개체 구성'."

동물은 개와 꼬리가 짖기 때문에 개가됩니다. 개가 시간이 지남에 따라 말을 배우는 우주에서이 행동을 수정할 수 있기를 원할 것입니다.

그런 다음 동작을 추상화 한 다음이 동작 내에서 상속을 사용할 수 있습니다.

class Tail 
{ 
    DoYourThing() 
} 

class WaggyTail : Tail 
{ 
    DoYourThing() 
    { 
    // Wag 
    } 
} 

class Noise 
{ 
    DoYourThing() 
} 

class Bark : Noise 
{ 
    DoYourThing() 
    { 
    // Bark 
    } 
} 

class Talk : Noise 
{ 
    DoYourThing() 
    { 
    // Talk 
    } 
} 

class Animal 
{ 
    public Noise { get; set; } 
    public Tail { get; set; } 
} 

당신은 당신의 고양이와 개를 설정할 수 있습니다 :이 클래스 구조와

당신이 당신의 슈퍼 필요로 할 때

Animal dog = new Animal { Noise = new Bark(), tail = new DoggyTail() } 
    Animal cat = new Animal{ Noise = new Purr(), tail = new CattyTail() } 

.. 다음 번식 당신은 간단한 변경 그들의 행동 할 수

개.Noise = new Talk();

.. 안녕하세요 presto, 당신의 개가 지금 말할 수 있습니다 .. 당신이 개를 그때 노래해야한다면, 당신은 새로운 노래 수업을 만듭니다. 더 이상의 변화는 필요 없습니다.

0

좋아, 내 새로운 규칙은 클래스가 다른 동작을하는 경우 상속을위한 것입니다. 그렇지 않으면 어떤 종류의 식별자로갑니다. (물론 최종 결정은 수업이 사용되는 환경에 달려 있습니다.) 모든 답변을 주셔서 감사합니다.