2014-01-17 26 views
0

我试图让这样的事情:接口方法

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

    } 
} 

我怎样才能做到这一点?

+0

OP可能想限制每个实现只接受自己的类型,尽管他忘了提及它。 –

+1

Update方法会用它的参数做什么? – boli

+0

@boli问道,做这件事有什么意义? “car”参数与处理实际实例的方式有何不同(如果您愿意,可以使用'this'实例)? – Groo

回答

2

你可以使ICar通用:

public interface ICar<T> where T : ICar<T> 
{ 
    public void Update<T>(T car); 
} 

,然后实现Update方法相应:

public class Peugeot : ICar<Peugeot> 
{ 
    public void Update(Peugeot car) 
    { 

    } 
} 

public class Volvo : ICar<Volvo> 
{ 
    public void Update(Volvo car) 
    { 

    } 
} 
+0

@IanNelson我更新了界面,谢谢。 –

+1

请注意,这(通常称为[奇怪的循环模板模式](http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern))并不妨碍您编写'class Plane:ICar '。 Eric Lippert在他的文章中也提到了这个问题(http://blogs.msdn.com/b/ericlippert/archive/2011/02/03/curiouser-and-curiouser.aspx)。 – Groo

0

可以(至少在某种程度上)通过进行显式接口实现实现这一点,然后提供正确输入的公开Update方法:

public interface ICar 
{ 
    void Update(ICar car); 
} 

public class Peugeot : ICar 
{ 
    public void Update(Peugeot car) 
    { 
     Update(car); 
    } 

    void ICar.Update(ICar car) 
    { 
     // do some updating 
    } 
} 

public class Volvo : ICar 
{ 
    public void Update(Volvo car) 
    { 
     Update(car); 
    } 

    void ICar.Update(ICar car) 
    { 
     // do some updating 
    } 
} 
+0

如果'ICar.Update'要在一个通用接口上完成所有工作,我没有看到具有针对该派生类型的单独方法的要点。 – Groo

+0

@Groo它会阻止你编写像'new Volvo()。Update(new Peugeot())'这样的代码;'只有常规的接口实现才允许这样做。你仍然可以写'((ICar)新的沃尔沃())。更新(新的标致());'但这很难让它错误。 –