2011-01-11 2 views
0

의 나는 다음과 같은 계층 구조를 만들 생각 해보자 , 호랑이, ...).계층 클래스 디자인

각 하위 클래스는 이전 것에 종속되어 있습니다.

이와 비슷한 트리 같은 클래스를 만드는 가장 좋은 방법에 대한 제안은 무엇입니까?

이 내가 손에 가지고 있지만 해결책은 나에게 많은 도움이 될 문제의 단지 예입니다 ...

감사

진짜 문제는 이것이다 : 나는 구문 분석해야

다음 유형의 메시지 0102060800FF.

먼저 01은 특정 유형의 메시지가 있음을 알립니다. 그 유형을 감안할 때, 나는 특정 테이블에서 02 값을 찾아야 만합니다 ...

상위로 필터링 된 하위 계층의 가능한 값을 원합니다. 내가 충분히 명확한 지 모르겠다.

감사합니다.

+1

좀 더 구체적인 예를 들어보십시오. – svrist

+0

질문에 방금 객체 지향 프로그래밍의 목적과 상속을 정의했습니다. 귀하의 질문에서 나는 당신이하려는 일에 대해 혼란스러워합니다. 그런 그래프를 시각적으로 표시하는 수업을 생각해 보려고합니까? 아니면 프로그램에서 데이터 객체의 구조에 대해 이야기하고 있습니까? –

+0

데이터 구조에 대해 이야기하고 있습니다. 실제 예제를 통해 클래스 유형의 계층 구조를 만들고 싶습니다. 기본 전화를 Type1로 정의하면 다음과 같은 가능성이 Type – tekknoplast

답변

1

최근에는 상속에 비해 선호하는 구성입니다. 여기에 예제가 있습니다. 적절한 계층 구조에 추가하고 있는지 확인하기 위해 좀 더 논리 검사가 필요합니다.

public class Class 
{ 
    private readonly IList<Animal> animals = new List<Animal>(); 

    public IEnumerable<Animal> Animals 
    { 
     get 
     { 
      return this.animals; 
     } 
    } 

    public void AddAnimal(Animal animal) 
    { 
     if (animal == null) 
     { 
      throw new ArgumentNullException("animal"); 
     } 

     this.animals.Add(animal); 
    } 

    //// etc. 
} 

public class Family 
{ 
    private readonly IList<Animal> animals = new List<Animal>(); 

    public IEnumerable<Animal> Animals 
    { 
     get 
     { 
      return this.animals; 
     } 
    } 

    public void AddAnimal(Animal animal) 
    { 
     if (animal == null) 
     { 
      throw new ArgumentNullException("animal"); 
     } 

     this.animals.Add(animal); 
    } 

    //// etc. 
} 

public class Species 
{ 
    private readonly IList<Animal> animals = new List<Animal>(); 

    public IEnumerable<Animal> Animals 
    { 
     get 
     { 
      return this.animals; 
     } 
    } 

    public void AddAnimal(Animal animal) 
    { 
     if (animal == null) 
     { 
      throw new ArgumentNullException("animal"); 
     } 

     this.animals.Add(animal); 
    } 

    //// etc. 
} 

public class Animal 
{ 
    private readonly Class @class; 
    private readonly Family family; 
    private readonly Species species; 

    public Animal(Class @class, Family family, Species species) 
    { 
     if (@class == null) 
     { 
      throw new ArgumentNullException("@class"); 
     } 

     if (family == null) 
     { 
      throw new ArgumentNullException("family"); 
     } 

     if (species == null) 
     { 
      throw new ArgumentNullException("species"); 
     } 

     [email protected] = @class; 
     this.family = family; 
     this.species = species; 
     [email protected](this); 
     this.family.AddAnimal(this); 
     this.species.AddAnimal(this); 
    } 

    public Class Class 
    { 
     get 
     { 
      return [email protected]; 
     } 
    } 


    public Family Family 
    { 
     get 
     { 
      return this.family; 
     } 
    } 


    public Species Species 
    { 
     get 
     { 
      return this.species; 
     } 
    } 
} 
1

실제 동물에 이르기까지 모든 클래스는 추상적 인 클래스입니다. 호랑이는 추상 클래스 Felidae, 추상 클래스 포유류 등에서 상속받은 구체적인 클래스입니다.

정말 멋지게하려면 IPredator, IWarmBlooded와 같은 인터페이스를 사용할 수 있습니다. 기능으로 정의하십시오.

+0

유형의 특정 범위로 제한됩니다. CAN을 사용한다고해서 반드시해야하는 것은 아닙니다. 인터페이스를 정의 할 구체적인 이유가 없다면 (예를 들어 포식자를 다른 것과 다르게 처리해야 할 때) 가능한 모든 분류에 대해 클래스 또는 인터페이스를 작성하지 않아야합니다. – Mark

+0

물론, 그게 그가 결정하기위한 것입니다. 그는 "왜"가 아니라 "방법"을 묻고있었습니다. –

+0

그의 업데이트를 살펴본 후에는 어쨌든 오브젝트 계층보다는 LINQ 제공자를 작성해야하는 것처럼 보입니다. –