2015-06-18 2 views
0

Я пытаюсь внедрить интерфейс свойств с классом, наследующим объявить его. Может быть, пример легче понять.C# Осуществить интерфейс и наследование

MyClassA в порядке, но MyClassB имеет ошибку компиляции: «Test.MyClassB» не реализует член интерфейса «Test.IMyInterface.PropA». Любая идея, как я могу это сделать?

/****** ****** EDITED КОД/

public class BaseClass 
{ 
    public int PropA { get; set; } 
} 

public class InheritClass : BaseClass 
{ 
    public int PropB { get; set; } 
} 

public interface IMyInterface 
{ 
    BaseClass PropClass { get; set; } 
} 


public class MyClassA : IMyInterface 
{ 

    public BaseClass PropClass { get; set; } 
} 

public class MyClassB : IMyInterface 
{ 

    public InheritClass PropClass { get; set; } 
} 
+1

'MyClassB' * не реализует' PropA'. Что ты пытаешься сделать? Вы не наследуете 'MyClassB' ни от чего. – Luaan

+0

FYI - вы можете щелкнуть правой кнопкой мыши по интерфейсу, который наследует класс, и «Реализовать» любые методы/свойства, описываемые интерфейсом. (В визуальной студии другие IDE могут отличаться) – WraithNath

+1

Хорошо, правильно, это намного яснее. Вы * должны * использовать ту же самую подпись. Несмотря на то, что 'InheritClass' наследует от' BaseClass', сигнатура метода все еще должна использовать 'BaseClass'. Фактическим значением может быть «InheritClass», но не подпись. Может быть, вы захотите использовать общий интерфейс? Или вспомогательное свойство? – Luaan

ответ

1

это то, что вы должны сделать

public class BaseClass 
{ 
    public int PropA { get; set; } 
} 

public class InheritClass : BaseClass 
{ 
    public int PropB { get; set; } 
} 

public interface IMyInterface 
{ 
    BaseClass PropClass { get; set; } 
} 


public class MyClassA : IMyInterface 
{ 

    public BaseClass PropClass { get; set; } 
} 

public class MyClassB : IMyInterface 
{ 
    private BaseClass _propClass; 

    public BaseClass PropClass 
    { 
     get { return (InheritClass)_propClass; } 
     set { _propClass = (InheritClass)value; } 
    } 
} 

это напрямую не возможно, и почему вы пытаясь сделать это. если у вас есть базовый класс, вы можете использовать его ребенок, чтобы установить или получить ...

+0

Извините, неверный код. –

+0

это правильно. но я считаю, что вы пытаетесь достичь чего-то, что неясно. проблема в другом месте, я думаю @DiegoMartelli –

+0

см. edit @DiegoMartelli –

0

Вашего интерфейса требует, чтобы все классы, которые реализуют ее имеют свойство int PropA { get; set; }, но ваш класс MyClassB не имеет этот метод еще наследуется IMyInterface.

У вас есть два варианта.

Один, просто реализовать интерфейс:

public class MyClassB : IMyInterface 
{ 
    public int PropA { get; set; } 
    public int PropB { get; set; } 
} 

Или два, если вы хотите только выставить PropB на MyClassB, то вы можете явно реализовать интерфейс (и при условии, что PropB должно быть осуществление), то вам хотел бы сделать это:

public class MyClassB : IMyInterface 
{ 
    int IMyInterface.PropA { get { return this.PropB; } set { this.PropB = value; } } 
    public int PropB { get; set; } 
} 
+0

Извините, неверный код. –

0

Вы должны добавить PropA в орудиях MyClassB:

public class MyClassB : IMyInterface 
{ 
**public int PropA { get; set; }** 
public int PropB { get; set; } 
} 
Смежные вопросы