接口继承&重载

时间:2015-10-12 10:25:12

标签: c# oop interface overloading

我正在处理如下界面:

public interface ISomething
{
    ...many auto-props, 
    void SetValues(ISomething thing) 
}

现在,我不拥有此界面,但我想用更多属性扩展它:

public interface ISomethingMoreSpecific : ISomething
{ 
    ...existing + my props, 
    void SetValues(ISomething thing)
}

在类ISomethingMoreSpecific中,我实现了一个重载,它接受派生接口并处理我的props和基本接口属性。

public void SetValues(ISomethingMoreSpecific specificThing) 
{
    ...set my props and base props
}

调用代码执行以下操作:

myThing.SetValues((ISomethingMoreSpecific)otherThing);

无论有没有强制转换,即使otherThingmyThing是实现ISomethingMoreSpecific的具体类型,该方法也不会调度到我的重载。我猜我忽略了一些简单的东西,但它是什么?

2 个答案:

答案 0 :(得分:2)

包括

void SetValues(ISomethingMoreSpecific specificThing);

进入ISomethingMoreSpecific。

答案 1 :(得分:0)

void SetValues(ISomething thing)再次ISomethingMoreSpecific。您是否打算隐藏它,然后使用new关键字。如果您不想隐藏,则需要在void SetValues(ISomething thing)中将void SetValues(ISomethingMoreSpecific)更改为ISomethingMoreSpecific。下面是您打算隐藏的代码,它可以用于强制转换。即使您没有隐藏它,也就是说不要使用new关键字。它有效。

public class Program
{
    public void Main(string[] args)
    {
        MyThing a = new MyThing();
        MyThing b = new MyThing();
        a.SetValues(b);//calls more specific
        a.SetValues((ISomething)b);//calls just the thing
    }   
}


public class MyThing : ISomethingMoreSpecific
{
    public void SetValues(ISomethingMoreSpecific specificThing)
    {
        Console.WriteLine ("more specific");
    }

    public void SetValues(ISomething thing)
    {
        Console.WriteLine ("just the thing");
    }
}

public interface ISomethingMoreSpecific : ISomething
{ 
    //...existing + my props, 
    new void SetValues(ISomething thing);
}

public interface ISomething
{
    //...many auto-props, 
    void SetValues(ISomething thing) ;
}