Наследование и интерфейсы .NET - PullRequest
3 голосов
/ 15 января 2010

Причудливый вопрос:

Представьте, что у меня есть базовый класс BaseFoo. У меня есть интерфейс с некоторыми методами под названием IFoo. И у меня есть тонны классов ниже BaseFoo.

Если я реализую интерфейс в BaseFoo, мне не нужно реализовывать в унаследованных классах, правильно?

Хорошо, но представьте, что у меня есть общая функция, которая будет обрабатывать IFoo. Нужно ли явно заявлять, что они реализуют IFoo?

Вот так (псевдо-иллюстративный код)

public class BaseFoo:IFoo;

public interface IFoo;

Должен ли я сделать это?

public class AmbarFoo:BaseFoo,IFoo

или

public class AmbarFoo:BaseFoo

Какой самый правильный путь? Эффекты одинаковы? Если я проверю, является ли AmbarFoo IFoo, что я получу?

Спасибо

Ответы [ 3 ]

7 голосов
/ 15 января 2010

Он будет вести себя одинаково независимо. Вам нужно будет только изменить имя интерфейса, если вы хотите переопределить интерфейс с явной реализацией интерфейса. Экземпляр AmbarFoo действительно «скажет», что он реализует IFoo.

0 голосов
/ 15 января 2010

В вашем случае это ничего не изменит.

Однако посмотрите на следующее:

public interface IFoo
{
    void Bar();
}

public class FooBase
    : IFoo
{
    public void Bar()
    {
        Console.WriteLine("FooBase");
    }
}

public sealed class SubFoo
    : FooBase//, IFoo
{
    public new void Bar()
    {
        Console.WriteLine("SubFoo");
    }
}

Теперь запустите следующее и закомментируйте "//, IFoo".

SubFoo foo = new SubFoo();

foo.Bar();
((IFoo) foo).Bar();

Однако это более теоретически.

Оставь это.

0 голосов
/ 15 января 2010

Если я реализую интерфейс в BaseFoo, мне не нужно реализовывать его в унаследованных классах, правильно?

Нет, потому что BaseFoo будет вынужден реализовать, а дочерние классы будутнаследовать реализацию.Хотя все они все еще будут IFoos.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...