2016-09-12 3 views
0

와 일반 클래스가 아닌 일반적인 인터페이스를 구현하는 방법에 내 코드입니다 :C#을 여기 제약

public interface ICar 
{ 
    CarModel Property { get; set; } 
    CarModel Method(); 
} 

public Car<T> : ICar where T : CarModel 
{ 
    T Property { get; set; } 
    T Method() 
    { 
     //Do Stuff 
    } 
} 

내가 제네릭 제약 조건 내 Car<T> 클래스의 인터페이스를 구현하지만 컴파일하지 않습니다 다음과 같은 오류 : https://dotnetfiddle.net/m1jDnB

내가 가지고 주위에있는 유일한 일 :

Compilation error (line 18, col 15): 'Car<T>' does not implement interface member 'ICar.Property'. 'Car<T>.Property' cannot implement 'ICar.Property' because it does not have the matching return type of 'CarModel'. 
Compilation error (line 18, col 15): 'Car<T>' does not implement interface member 'ICar.Method()'. 'Car<T>.Method()' cannot implement 'ICar.Method()' because it does not have the matching return type of 'CarModel'. 

내가 또한 비 일반 될 인터페이스를 필요로 여기에 닷넷 바이올린입니다 왜냐하면 원하는대로 인터페이스를 구현하는 무언가로 속성이나 메서드를 래핑하는 것입니다.하지만이 작업을 수행하고 싶지 않습니다. 예 :

public Car<T> : ICar where T : CarModel 
{ 
    T Property { get; set; } 
    T Method() 
    { 
     //Do Stuff 
    } 

    CarModel ICar.Property 
    { 
     get {return Property; } 
     set {Property = (CarModel)value; } 
    } 

    CarModel ICar.Method() 
    { 
     return (CarModel)Method(); 
    } 
} 

더 좋은 방법이 있습니까?

+0

빌드 오류는 묵시적 메서드가 값을 반환하지 않는 것처럼 보입니다. – markmnl

+0

'자동차 '이 (가) 설계에 허용됩니까? ('MyCarModel'은'CarModel'에서 상속 받았습니다.) –

+0

@markmnl, 죄송합니다. 위의 내용과 같이 변경된 내용을 작성한 것에 미안합니다. –

답변

0

이 작업을 수행 할 수 없습니다. 컴파일러가이를 허용했다면 그 결과는 타입 안전하지 않을 것입니다. 형식이 원하는대로 컴파일되도록 허용 된 경우이 코드는 컴파일러에서 허용됩니다.

public class CarModel { 
    public string Name { get; set; } 
} 

public class Toyota : CarModel { 
    public string SpecialToyotaNumber { get; set; } 
} 

public class Honda : CarModel { } 

public interface ICar { 
    CarModel Property { get; set; } 
    CarModel Method(); 
} 

public class Car<T> : ICar where T : CarModel { 
    public T Property { get; set; } 

    public T Method() { 
     return (T)new CarModel(); 
    } 
} 

public class Main { 
    public void Run() { 
     ICar car = new Car<Toyota>(); 
     car.Property = new Honda(); // the concrete property is declared Toyota 
    } 
}