2012-03-20 2 views
1
내가

제네릭의 유형 안전을 얻고 때 제네릭을 사용하지

public class MyVehicleCollection<T> where T : Vehicle 
{ 
    private List<T> listofVehicles = new List<T>(); 

    public void AddVehicle(T v) { listofVehicles.Add(v); } 
} 

public class MyVehicleCollection<Vehicle> 
{ 
    private List<Vehicle> listofVehicles = new List<Vehicle>(); 

    public void AddVehicle(Vehicle v) { listofVehicles.Add(v); } 
} 

의 차이점에 대한 불분명 해요

나는이 표시되지 않는 이유는 두 경우 모두에서 유일한 가능 Vehicle에서 파생 된 유형을 컬렉션에 추가합니다. 또한 Motobike를 포함하기위한 추가 컬렉션 클래스를 만들어야하는 이유를 알 수 없습니다. 비 제너릭 케이스의 차량.

미리 감사드립니다.

+0

향후 필요하거나 예상되지 않을 수도있는 일부 확장 성을 교환하십시오. 물론 미래에는 자전거를 추가 할 수 있지만 그렇게 할 생각입니까? 미래에 따라 폐쇄 형 또는 개방형 아키텍처를 만들 수 있습니다. – CodingBarfield

+1

당신이 'Vehicle'을 제네릭 형식 매개 변수와 클래스 이름으로 사용하고 있다는 사실 때문에 혼동을 일으키는 것 같습니다. –

답변

1

는 두 번째 형태는 모든 차량에 바인딩되지 않습니다

당신의 설명에서
public class MyVehicleCollection<Vehicle> 
{ 
} 

... 

var coll = new MyVehicleCollection<string>(); 

, 당신은 모든 제네릭을 필요로하지 않는 것.

var garage = new MyPlainVehicleCollection(); 
garage.Add(new Motobike()); 
+0

은 클래스 정의 줄에서 무엇을합니까? 즉 컴파일러에게 무엇을 말합니까? 그냥 빠져 나갈 수 있을까요? – gwizardry

+0

''은 Type 매개 변수입니다. 클래스와 동일한 이름을 사용하는 것은 위험합니다. 두 번째 샘플을 ''이라고 쓰고 더 나은 결과를 확인하십시오. –

+0

"그냥 빠져 나갈 수 있습니까?" - 그건 절대로 같지 않아요. 때로는 그것을 버릴 수도 있습니다. –

0

사이의 차이 : 내가 포함 Motobike : Vehicle

에 대한 추가 컬렉션 클래스를 만들 필요가 줄 이유도

public class MyPlainVehicleCollection //<Vehicle> no Type Parameter 
{ 
    private List<Vehicle> listofVehicles = 
      new List<Vehicle>(); // class Vehicle 

    public void AddVehicle(Vehicle v) { listofVehicles.Add(v); } 
} 

당신은하지 않습니다 표시되지 않습니다 두 개는 런타임에 있지만 컴파일 타임에는 없습니다.

첫 번째 경우에는 Vehicle 또는 Vehicle에서 파생 된 유형으로 만 MyVehicleCollection을 선언 할 수 있습니다.

두 번째 경우에는 @Henk Holterman이 이미 말한 것처럼 모든 유형의 MyVehicleCollection을 선언 할 수 있습니다.

1

일반적으로 차량에서 파생되는 한 수업에서 허용하는 유형을 시행하는 데 사용합니다.

당신이

class Truck : Vehicle {} 

이있는 경우 는
class Van : Vehicle {} 

당신은

var x = new MyVehicleCollection<Truck>(); 

을 선언 할 수 있습니다 그런 다음 컴파일러 오류가 발생할 것이다 다음

x.AddVehicle (new Van()); 
0

난 당신이

//somewhere in the code have a method 
public static string GetVehicleName<T>(T vehicle) where T : Vehicle, new() 
{ 
    return vehicle.GetVehicleName(); 
} 

//abstract class Vehicle 
public abstract class Vehicle 
{ 
    public abstract string GetVehicleName(); 
} 

//Child class 
public class Car : Vehicle 
{ 
    public override string GetVehicleName() 
    { 
    return "Car"; 
    } 
} 

와 (이 명확하게됩니다 이런 식으로을 할 수있다 )뿐만 아니라 클래스 선언뿐만 아니라 방법을 생각해야한다고 생각

GetVehicleName(new Car()); //will return "Car" 

이 같은 사용이 후 프로덕션 준비가 된 코드가 아니라 단지 당신, 희망, 아이디어를주는 예제입니다.

그것은 bascially 만들고이 도움이 어떤 유형

Vehicles의 희망을 호스팅 할 수있는 기능에 대한 추상화 계층은.

0

이 예에서는 이점이 반드시 필요하지 않습니다. 예를 들어, 당신은 자식 목록을 포함 된 데이터 구조의 슈퍼 새로운 유형을 만들어 말 :

public SuperFastForwardOnlyList<T> : where T : IEnumerable 
{ 
    public void AddList(T childList); 

    //Crazy new algorithm here that is going to earn you a fortune, but must use collections  
    //of the same type. 
} 
그런 다음이 알고리즘에 대한 제약 조건이 충족, 열거의 모든 유형이 사용할 수 있습니다

:

SuperFastOnlyList<IList> listOfLists = new SuperFastOnlyList<IList>(); 

listOfLists.Add(new List()); //Fine 
listOfLists.Add(new object()); //Whoops - compile time error. 

이 예제는 약간 고안되었지만 더 밝아 질 수 있습니까?

관련 문제