2015-10-12 7 views
1

Я имею дело с интерфейсом следующим образом:интерфейс Наследование и Перегрузки

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

Теперь, я не являюсь владельцем этого интерфейса, но я хотел бы продлить его еще пару свойствами:

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

В классе реализует ISomethingMoreSpecific Я реализовал перегрузку, которая берет производный интерфейс и обрабатывает как мои реквизиты, так и свойства базового интерфейса.

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

Вызывающий код выполняет следующие действия:

myThing.SetValues((ISomethingMoreSpecific)otherThing); 

С или без броска, метод не пошлет к моей перегрузке, даже если otherThing и myThing конкретные типы, реализующие ISomethingMoreSpecific. Я предполагаю, что я пропускаю что-то простое, но что это?

ответ

2

Включить

void SetValues(ISomethingMoreSpecific specificThing); 

в ISomethingMoreSpecific.

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) ; 
}