2013-12-13 3 views
1

У меня есть следующиеНаследование интерфейса в качестве типа возвращаемого значения - не удается преобразовать выражение

public interface IAwesomeInterface 
{ 
    string Prop1 {get; set;} 
    string Prop2 {get; set;} 

    List<SomeObject> GetObjects(); 
} 

public abstract class AbstractObject : IAwesomeInterface 
{ 
    public string Prop1 {get; set;} 
    public string Prop2 {get; set;} 

    public abstract List<SomeObject> GetObjects(); 

} 

public class ConcreteObject1 : AbstractObject 
{ 
    public List<SomeObject> GetObjects() 
    { 
     return new List<SomeObject>(); 
    } 
} 

public class ConcreteObject2 : AbstractObject 
{ 
    public List<SomeObject> GetObject() 
    { 
     //do some other stuff 
     return new List<SomeObject>(); 
    } 
} 

и реализации:

public class ObjectFactory 
{ 

    public IAwesomeInterface GetObject() 
    { 

     return new ConcreteObject1(); 
    } 
} 

я получаю сообщение об ошибке, что «не может преобразовать тип выражения ConcreteObject1 возвращать тип IAwesomeInterface "

Поскольку ConcreteObject1 наследует объект AbstractObject, не означает, что он реализует IAwesomeInterface и должен быть приемлемым возвратом стоимость?

+0

FYI, возможно, была ошибкой копирования/вставки, но ваш метод 'ConcreteObject2.GetObject' является typo'd (должен быть' GetObjects', plural) –

+0

Спасибо, это была опечатка для вопроса. Проблема заключалась в том, что я не переопределял абстрактный метод. – Mike

ответ

6

Ваш код генерирует также другую ошибку, которая является причиной второй существует:

«ConcreteObject1» не реализует унаследованный абстрактный член «AbstractObject.GetObjects()»

Устранить один, и тот, который вы указали, тоже уйдет. Чтобы сделать это, добавьте override рядом GetObjects() метод в обоих ConcreteObject1 и ConcreteObject2:

public class ConcreteObject1 : AbstractObject 
{ 
    public override List<SomeObject> GetObjects() 
    { 
     return new List<SomeObject>(); 
    } 
} 

public class ConcreteObject2 : AbstractObject 
{ 
    public override List<SomeObject> GetObjects() 
    { 
     //do some other stuff 
     return new List<SomeObject>(); 
    } 
} 

PS. У вашего кода была опечатка в имени метода GetObjects. Вы пропустили s в конце имени метода.

+0

Спасибо. Checkmark через минуту. – Mike

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