Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 接口方法,该方法接收继承它的类类型的参数_C#_Class_Methods_Interface - Fatal编程技术网

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)
    {

    }
}