c#-如何在具有约束的泛型类中实现非泛型接口
这是我的密码:c#-如何在具有约束的泛型类中实现非泛型接口,c#,generics,interface,implements,C#,Generics,Interface,Implements,这是我的密码: public interface ICar { CarModel Property { get; set; } CarModel Method(); } public Car<T> : ICar where T : CarModel { T Property { get; set; } T Method() { //Do Stuff } } 公共接口ICar { CarModel属性{get;set
public interface ICar
{
CarModel Property { get; set; }
CarModel Method();
}
public Car<T> : ICar where T : CarModel
{
T Property { get; set; }
T Method()
{
//Do Stuff
}
}
公共接口ICar
{
CarModel属性{get;set;}
CarModel方法();
}
公共汽车:ICar,其中T:CarModel
{
T属性{get;set;}
T方法()
{
//做事
}
}
我已经在我的Car
类中使用通用约束实现了接口,但它没有编译,出现以下错误:
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'.
编译错误(第18行,第15列):'Car'未实现接口成员'ICar.Property'Car.Property'无法实现'ICar.Property',因为它没有匹配的返回类型'CarModel'。
编译错误(第18行,第15列):“Car”未实现接口成员“ICar.Method()”Car.Method()'无法实现'ICar.Method()',因为它没有匹配的返回类型'CarModel'。
我还需要非通用的接口,下面是一个.Net fiddle:
我唯一能做的就是用实现接口的东西来包装属性或方法,但我不想这样做。即:
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();
}
}
公共汽车:ICar,其中T:CarModel
{
T属性{get;set;}
T方法()
{
//做事
}
卡莫德尔伊卡酒店
{
获取{return Property;}
设置{Property=(CarModel)值;}
}
CarModel ICar.方法()
{
return(CarModel)方法();
}
}
有更好的办法吗?这是办不到的。如果编译器允许您这样做,那么结果将不会是类型安全的。如果允许类型按照您想要的方式编译,那么编译器将允许此代码
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
}
}
公共类CarModel{
公共字符串名称{get;set;}
}
公共级丰田:CarModel{
公共字符串specialToytanumber{get;set;}
}
公共级本田:卡莫代尔{}
公共接口ICar{
CarModel属性{get;set;}
CarModel方法();
}
公共级汽车:ICar,其中T:CarModel{
公共T属性{get;set;}
公共T方法(){
返回(T)新CarModel();
}
}
公共班机{
公开募捐{
ICar汽车=新车();
car.Property=new Honda();//具体属性声明为Toyota
}
}
生成错误是什么,看起来您的实现方法没有返回值。您的设计中是否允许Car
?(MyCarModel
继承自CarModel
)@markmnl,很抱歉,我在编写过程中的错误导致了以下更改:above@DannyChen查看.Net提琴,它显示了你的要求,但仍然存在错误。你不想做的事情是实现你所说的你想实现的最好方式。(除了setter应该有Property=(T)值;
而不是Property=(CarModel)值
。但是,这确实增加了运行时错误的可能性,如@recursive的答案中所示