Наследование интерфейса и новое ключевое слово - PullRequest
10 голосов
/ 23 марта 2011

Я хочу:

public interface IBase
{
    MyObject Property1 { get; set; }
}

public interface IBaseSub<T> : IBase
{
    new T Property1 { get; set; }
}

public class MyClass : IBaseSub<YourObject>
{
    public YourObject Property1 { get; set; }
}

Но это не компилируется. Выдает ошибку:

//This class must implement the interface member IBase.Property1

Может кто-нибудь пролить свет на это? Я думал, что это должно работать ..

Спасибо

Ответы [ 2 ]

14 голосов
/ 23 марта 2011

IBaseSub<T> требуется IBase.Я говорю «требует», потому что он более точно отражает практические последствия, чем сказать, что он «наследует» IBase, что подразумевает переопределение и другие вещи, которые просто не происходят с интерфейсами.Можно сказать, что класс, реализующий IBaseSub<T>, реализует и то и другое, например:

public class MyClass : IBase, IBaseSub<YourObject>

Возвращаясь к тому, что я сказал о наследовании, - нет такой вещи с интерфейсами, что означает только то, что оба интерфейсаиметь свойство с тем же именем, производное не переопределяет и не скрывает базовое.Это означает, что теперь ваш класс должен буквально реализовать два свойства с одинаковым именем , чтобы выполнить оба контракта.Вы можете сделать это с помощью явной реализации :

public class MyClass : IBase, IBaseSub<YourObject>
{
    public YourObject Property1 { get; set; }
    MyObject IBase.Property1 { get; set; }
}
2 голосов
/ 23 марта 2011

Вам необходимо реализовать свойства как IBase, так и IBaseSub<YourObject>, так как последнее расширяется до первого.

Использование new в IBaseSub<T> не позволяет вам «снять трубку» в отношении необходимости иметь MyObject Property1 { get; set; }. Он просто позволяет вам объявить другое свойство с именем Property1, которое должны иметь разработчики IBaseSub<T>.

Поскольку в MyClass не может быть двух свойств с одинаковыми именами, вам придется явно реализовать хотя бы одно из них:

public class MyClass : IBaseSub<YourObject>
{
    MyObject IBase.Property1 { get; set; }
    public YourObject Property1 { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...