2012-03-09 2 views
0

"동물"클래스를 구성하는 추상 클래스 "MainClass"가 있습니다. 나는 공통 기능을 포함하는 추상 클래스에서 TypeA와 TypeB의 두 클래스를 파생시킨다. TypeA 및 TypeB 클래스는 고유 한 기능을 포함하도록 확장해야합니다.디자인 패턴을 사용하여 런타임에 기능을 추가하십시오.

예를 들어 TypeA는 Animal 클래스에서 cat 기능을 추가해야합니다. 그래서이 테스트 어플리케이션은이 typeA._animals._cat과 같은 cat 클래스에 액세스 할 것입니까?

런타임에 유형을 추가 할 수 없다는 것을 알고 있지만 내 문제를 해결할 수있는 다른 디자인 패턴이 있습니까?

public abstract class MainClass 
{ 
    public Animal _animals; 
} 

public class Animal 
{ 
    public Tiger _tiger; 
} 

public class Tiger 
{ 
    public int type { get { return "Tiger" ; } } 
} 

public class Cat 
{ 
    public int type { get { return "Car" ; } } 
} 

public class Leopard 
{ 
    public int type { get { return "Leopard" ; } } 
} 

public class TypeA : MainSession 
{ 
    //Would like to add type Cat to Animal class 
} 

public class TypeB : MainSession 
{ 
    //Would like to add type Leopard to Animal class 
} 
+0

제목에 태그를 사용할 필요가 없습니다. –

+0

어떤 수업이 TypeA와 TypeB입니까? 추상 클래스로 Animal 클래스를 생성하고 타이거, Cat, Leopard를 상속 받아서는 안됩니까? – Asdfg

+0

해결하려는 문제가 정확히 무엇입니까? 현재 클래스 구조가 나에게 적합하지 않습니다. – BrokenGlass

답변

0

우선 상속을 만드는 것입니다 공장 방법으로 AddAnimal :

public abstract class MainSession 
{ 
    private List<IAnimal> _animals; 

    public IEnumerable<IAnimal> Animals {get { return _animals; }} 

    protected IAnimal CreateAnimal(string speciesName) 
    { 
     // Either use reflection to find the correct species, 
     // or a simple switch like below: 
     switch (speciesName) 
     { 
      case "tiger": 
       return new Tiger(); 
       break; 
     } 
    } 
} 

공장을 MainSession에두면 단일 책임 원칙이 위반되므로 별도의 클래스로 분류합니다.

1

첫째, 나는 호랑이, 고양이, 표범이 동물을 이어 받아야한다고 생각합니다. 이제, 제약 조건이있는 일반 기본 클래스를 사용하여 동일한 작업을 수행 할 수 있습니다. 예 :

public abstract class MainClass<A> where A:Animal 
{ 
    public A _animals; 
} 

public abstract class Animal 
{ 
    ... 
} 

public class Tiger : Animal 
{ 
    ... 
} 

public class Cat : Animal 
{ 
    ... 
} 

public class Leopard : Animal 
{ 
    ... 
} 

public class TypeA : MainSession<Cat> 
{ 
    ... 
} 

public class TypeB : MainSession<Leopard> 
{ 
    .... 
} 
0

예, 초록 공장 패턴을 사용하면 문제를 해결할 수 있습니다. 에이 체크 아웃 :

http://en.wikipedia.org/wiki/Abstract_factory_pattern

+0

추상적 인 공장이 어떻게 나를 도울 수 있는지 잘 모르겠습니다. 더 설명해 주시겠습니까? – sundar

+0

jgauffin의 대답의 두 번째 부분은 factory를 사용하는 한 가지 예입니다. – Shaunak

0

메인 클래스가 List<Animal> _animals 대신 Animal _animals의를 가질 필요가있다. Tiger, Cat 및 Leopard 클래스는 Animal 클래스에서 상속해야합니다. 그런 다음 type 속성을 Animal 기본 클래스에 넣을 수 있습니다. 런타임에 _animals 목록에 Animals을 원하는만큼 추가 할 수 있으며 type 속성은 Animal 기본 클래스에 있으므로 모든 파생 클래스에서 액세스 할 수 있습니다. 의 그것을 사용하자

public class Tiger : IAnimal 
{ 
    public string SpeciesName { get { return "Tiger" ; } } 
} 


public class Cat : IAnimal 
{ 
    public string SpeciesName { get { return "Cat" ; } } 
} 

을 : 당신은 또한을 변환 할 수

public abstract class MainSession 
{ 
    private List<IAnimal> _animals; 

    public IEnumerable<IAnimal> Animals {get { return _animals; }} 

    proteced void AddAnimal(IAnimal animal) 
    { 
     _animals.Add(animal); 
    } 
} 

public class TypeA : MainSession 
{ 
    public TypeA() 
    { 
     AddAnimal(new Tiger()); 
    } 
} 

public class TypeB : MainSession 
{ 
    public TypeB() 
    { 
     AddAnimal(new Leopard()); 
    } 
} 

public interface IAnimal 
{ 
    string SpeciesName {get; } 
} 

그리고 그것을 구현 : 당신이해야

+0

나는 목록을 유지할 것을 생각했지만 유형에 액세스하려면 목록을 반복해야 할 것입니다. 유형의 이름을 사용하여 액세스하고 싶습니다. – sundar

+0

목록 대신 사전을 사용하여 유형을 키로 사용하고 Animal 객체를 값으로 사용할 수 있습니다. – robbymurphy

관련 문제