2013-05-14 2 views
0

У меня есть интерфейс iClass. Один из методов в интерфейсе принимает другой интерфейс, iObject, в качестве аргумента.Вызов определенного потомка интерфейса в реализации другого интерфейса

В одной конкретной реализации iClass, мне нужен способ, чтобы принять конкретную реализацию в iObject, ObjectImplementation - но C# говорит мне, что нужно реализовать метод, как есть.

Почему это? не является ObjectImplementation экземпляром iObject? Как мне обойти это? Вместо этого я попытался использовать абстрактный класс, и я попал в один и тот же беспорядок.

public interface iClass { 
    bool SomeMethod(iObject object); 
} 

public interface iObject { 
    ... // some methods here 
} 

public ObjectImplementation : iObject { 
    ... // some method implementations here 
} 

public ClassImplementation : iClass { 
    public bool SomeMethod(ObjectImplementation object) // <- C# compiler yells at me 
    { 

    } 
} 

ответ

2

Контракт четко говорится о том, что метод требует iObject. ObjectImplementation - один класс, реализующий этот интерфейс. Но могут быть и другие. В контракте iClass указано, что все эти варианты являются действительными параметрами.

Если вам действительно нужно ограничить параметр, чтобы ObjectImplementation рассмотреть вопрос об использовании общего интерфейса:

public interface IClass<T> where T : IObject 
{ 
    bool SomeMethod(T item); 
} 

public ClassImplementation : IClass<ObjectImplementation> 
{ 
    public bool SomeMethod(ObjectImplementation item) 
    { 

    } 
} 
0

Оставляя iObject в качестве параметра является путь, это также должно работать:

public interface iClass { 
    bool SomeMethod(iObject obj); 
} 

public interface iObject { 
} 

public class ObjectImplementation : iObject { 
} 

public class ClassImplementation : iClass { 
    public bool SomeMethod(iObject obj) 
    { 
     return false; 
    } 
} 
+0

Этот не будет работать, если для реализации «SomeMethod» в «ClassImplementation» действительно нужна «ObjectImplementation» и ничего больше. Например. потому что 'ObjectImplementation' имеет дополнительные члены. –

Смежные вопросы