2011-11-17 2 views
4

제네릭 사용 여부에 관한 간단한 질문이 있습니다. 그렇다면 올바른 방법입니까?제네릭 사용 여부

정상이 아닌 일반 버전은 다음과 같습니다 :

public interface IFood 
{ 
    string name { get; set; } 
} 

public class Vegetables : IFood 
{ 
    #region IFood Members 

    public string name 
    { 
     get { return "Cabbage"; } 
     set{ } 
    } 

    #endregion 
} 

public class Cow 
{ 
    private IFood _food; 

    public Cow(IFood food) 
    { 
     _food = food; 
    } 

    public string Eat() 
    { 
     return "I am eating " + _food.name; 
    } 
} 

일반 버전은 다음과 같습니다 :

public class Cow<T> where T : IFood 
{ 
    private T _food; 
    public Cow(T food) 
    { 
     _food = food 
    } 

    public string Eat() 
    { 
     return "I am eating " + _food.name; 
    } 
} 

내가 바로 일반 버전에 최선을 다하고 있습니까? 미래 성장을 위해 Generic 버전을 사용해야합니까? 이것은 원래 시나리오의 단순한 실물 모형이지만 완전히 닮았습니다.

+6

암소 클래스는 암소와 완전히 별개입니다. ? 또는 주어진 소에게 곡물, 옥수수 또는 요즘 동물 사료용으로 사용되는 다른 보풀을 먹일 수 있습니까? 제네릭 버전의 소는 같은 것이 아니며 목록 은 목록 과 동일합니다. 반면에, 나에게는 암소가 암소입니다. –

+0

@AnthonyPegram : 대답이 있어야합니다. – Dani

+0

@AnthonyPegram Cow 이 Cow 과 다른 이유 때문에 Generic 버전을 사용하지 않는 것이 좋습니다.적절한 예제와 응답 섹션에서 간략하게 설명 할 수 있습니까? 답장으로 표시하고 싶기 때문에 주석 섹션에 넣지 마십시오. – DotNetInfo

답변

10

나는이 구체적인 예에서 나쁜 생각을하고 있습니다.

List<int>은 종종 List of int로 설명됩니다. Cow<IFood>은 설명하기가 어렵습니다. 확실히 IFood의 암소는 아닙니다. 이것은 슬램 덩크 인수가 아니지만 잠재적 인 문제를 보여줍니다.

MSDN 상태 :

사용 일반적인 유형의 코드 재사용, 형 안전, 성능을 최대화합니다.

예를 들어, 제네릭 버전은 더 이상 코드 재사용이없고 형식 안전성이 향상되고 성능이 향상되지 않습니다.

3

제네릭을 사용하여 행동 규칙을 적용하는 것은 매우 나쁜 생각입니다. 젖소가 채소를 먹을 수있게하려면, 그것은 더 많은 논리이며, 컴파일러가 그것을 시행하도록하려는 것이 아니라 논리적 인 규칙에 의해 시행되어야합니다. 따라서 젖소는 모든 음식을 받아 들여야 만합니다. 그런 다음 응용 로직은 먹을 수있는 것 외에 무엇인가를 주면 무엇을 할 것인지 결정합니다.

헤이를 암소가 먹을 수있는 것으로 추가하기로 결정한 경우, IVegetableOrHay 인터페이스를 만들지 않는 한 제네릭을 사용하여 야채 또는 건초를 줄 수있는 방법이 없습니다. , 그것은 우리 모두가 단지 그 암소를 죽이고 저녁 식사를 위해 그것을 먹기를 원할 것입니다.

컴파일러 유형 강제는 적절한 프로그램 구조를 보장하기위한 것입니다. 응용 프로그램 논리는 코드로 속합니다.

1

제네릭을 사용하여 하위 클래스 기능을 확장/구현하고 싶습니까? 그렇다면 이것은 일반의 목적이 아닙니다. 모든 유형의 객체가 동일한 목적을 가지고있는 경우 generic을 사용합니다. 직렬화 같이. 여기에 COW를 일반화하면 COW 내부에 COW 기능의 하위 클래스를 구현해야합니다. 다른 하위 클래스의 유증을 거부하지 않을 것입니다. 여기서 COW는 일반 클래스 대신 수퍼 클래스가 될 수 있습니다. 다른 종류의 클래스에 대해 제네릭을 사용하라는 조언. 동일한 종류의 클래스 내에 있지 않습니다.