2013-05-21 5 views
0

Предположим, иметь интерфейс, как это:Что не так в этом интерфейсе?

interface MyInterface 
{ 
    public string AProperty { get; set;} 

    public void AMethod() 
} 

Этот интерфейс используется внутри другого интерфейса:

interface AnotherInterface 
{ 
    public MyInterface member1 { get; set; } 

    public int YetAnotherProperty {get; set;} 
} 

Теперь предположим, что иметь два класса, один, который реализует каждый из интерфейсов.

class MyInterfaceImpl : MyInterface 
{ 
    private string aproperty 
    public string AProperty 
    { 
     //... get and set inside 
    } 

    public void AMethod() 
    { 
     //... do something 
    } 
} 

И наконец:

class AnotherInterfaceImpl : AnotherInterface 
{ 
    private MyInterfaceImpl _member1; 
    public MyIntefaceImpl member1 
    { 
     //... get and set inside 
    } 

    ...Other implementation 
} 

Почему компилятор жалуется, что AnotherInterfaceImpl не реализует MyInterface?

Я понимаю, что это очень простой вопрос ... но мне нужно сериализовать в xml AnotherInterfaceImpl, и я не могу этого сделать, если member1 имеет тип MyInterface.

+1

Если вы можете изменить 'public MyIntefaceImpl member1' на' public MyInterface member1', компилятор должен быть удовлетворен. – Corak

+0

@Corak: Это должен быть ответ. –

+1

Код и сообщение об ошибке не совпадают. Компилятор должен пожаловаться на то, что 'AnotherInterfaceImpl' не реализует' AnotherInterface'. –

ответ

3

Ваш класс AnotherInterfaceImpl фактически не выполняет всех членов AnotherInterface. Общественное имущество AnotherInterfaceImpl.member1 должно иметь тип MyInterface, а не MyInterfaceImpl.

Обратите внимание, что это ограничение распространяется только на общественное имущество. Частное поле AnotherInterfaceImpl._member1 все еще может быть типа MyInterfaceImpl, потому что MyInterfaceImpl реализует MyInterface.

3

Почему компилятор жалуется, что AnotherInterfaceImpl не реализует MyInterface?

Потому что он не реализует его. У него есть член, который его реализует.

Это похоже на то, что «у моего объекта-клиента есть свойство заказов (списка), как мой клиент не является списком?»

Если вы были либо:

interface AnotherInterface : MyInterface 

или

class AnotherInterfaceImpl : AnotherInterface, MyInterface 

, то было бы справедливо сказать, что AnotherInterfaceImpl реализован MyInterface.

1

вам нужно «явно» вводить ваши члены, как их определяет интерфейс.

class AnotherInterfaceImpl : AnotherInterface 
{ 
    private MyInterfaceImpl _member1; 
    public MyInteface member1 
    { 
     get{ return _member1;} 
     set{ _member1 = value;} 
    } 

    ...Other implementation 
} 
Смежные вопросы