Частично реализовать интерфейс - PullRequest
3 голосов
/ 25 февраля 2010

Я спросил что-то подобное, но до сих пор у меня нет четкого представления. Моя цель - частично реализовать интерфейс в C # .

Возможно ли это? Есть ли шаблон для достижения этого результата?

Ответы [ 5 ]

13 голосов
/ 25 февраля 2010

Интерфейс определяет контракт. Вы должны выполнить этот договор, внедрив всех его членов, если хотите его использовать.

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

8 голосов
/ 25 февраля 2010

Вы можете выбросить NotImplementedException для методов, которые вы не хотите реализовывать, или NotSupportedException для методов, которые вы не можете реализовать.

Желательно не делать этого, но в .NET Framework есть места, где классы выдают NotSupportedException s, а дизайн Stream в значительной степени заставляет вас выбросить это исключение для некоторых методов.

С MSDN о NotSupportedException:

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

3 голосов
/ 25 февраля 2010

Как уже говорили другие, интерфейс должен быть полностью реализован (хотя есть способы обойти это, например, выбрасывать NotSupportedExceptions)

Вы должны взглянуть на Принцип разделения интерфейсов (один из SOLID принципов , который обсуждает Роберт Мартин) и выяснить, действительно ли вам нужно несколько интерфейсов, которые классы могут затем выбрать какие из них реализовать

2 голосов
/ 19 марта 2012

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

public interface myinterface
{
     void a();
     void b();
}
public abstract  class myclass : myinterface
{
    public void a()
    {
        ///do something
    }

  public   abstract void  b(); // keep this abstract and then implement it in child class
}
0 голосов
/ 19 марта 2012

Как и другие посты, выбрасывать исключение в дополнение к сокрытию участника - ваша лучшая ставка.

interface IPartial
{
    void A();
    void B();
}

class Partial : IPartial
{
    public void A()
    {
        // Implementation here
    }
    void IPartial.B()
    {
        throw new NotImplementedException();
    }
}

class Main
{
    Main()
    {
        Partial t = new Partial();
        t.A();
        t.B(); // Compiler error

        IPartial s = new Partial();
        s.A();
        s.B(); // Runtime error
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...