C# 接口方法,该方法接收继承它的类类型的参数
我正在尝试做这样的事情:C# 接口方法,该方法接收继承它的类类型的参数,c#,class,methods,interface,C#,Class,Methods,Interface,我正在尝试做这样的事情: public interface ICar { public void Update(/*something here*/); } 然后是两类: public class Peugeot : ICar { public void Update(Peugeot car) { } } public class Volvo : ICar { public void Update(Volvo car) { } }
public interface ICar
{
public void Update(/*something here*/);
}
然后是两类:
public class Peugeot : ICar
{
public void Update(Peugeot car)
{
}
}
public class Volvo : ICar
{
public void Update(Volvo car)
{
}
}
如何实现这一点?您可以将
ICar
设置为通用:
public interface ICar<T> where T : ICar<T>
{
public void Update<T>(T car);
}
您可以(至少在某种程度上)通过进行显式接口实现,然后提供正确键入的公共Update
方法来实现这一点:
公共接口ICar
{
无效更新(ICar car);
}
公共级标致:ICar
{
公共空间更新(标致汽车)
{
更新(汽车);
}
无效ICar.更新(ICar车辆)
{
//做一些更新
}
}
公共级沃尔沃:ICar
{
公共无效更新(沃尔沃汽车)
{
更新(汽车);
}
无效ICar.更新(ICar车辆)
{
//做一些更新
}
}
OP可能想限制每个实现只接受自己的类型,尽管他忘了提到它。Update方法会如何处理其参数?正如@boli所问的,这样做有什么意义?car
参数与处理该参数的实际实例(如果愿意,此
实例)有何不同?请注意,这(通常称为a)并不妨碍您编写类平面:ICar
。Eric Lippert也提到了这个问题。如果ICar.Update
要在一个公共接口上完成所有工作,我认为没有必要为该派生类型指定一个单独的方法。@Groo它会阻止您编写类似new Volvo().Update(new Peugeot())的代码代码>这将只允许常规接口实现。您仍然可以编写((ICar)new Volvo()).Update(new Peugeot())代码>但这样做更难出错。
public class Peugeot : ICar<Peugeot>
{
public void Update(Peugeot car)
{
}
}
public class Volvo : ICar<Volvo>
{
public void Update(Volvo car)
{
}
}