Как не реализовать функцию интерфейса в классе? - PullRequest
4 голосов
/ 03 декабря 2009

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

Что нужно сделать, если я не хочу реализовать функцию в моем классе, которая объявлен в интерфейсе, который реализовано моим классом.

Отредактировано: Я использую .NET с C #. Было бы здорово, если бы кто-нибудь смог привести пример кода в C #.

Спасибо

Ответы [ 6 ]

13 голосов
/ 03 декабря 2009

Реализуйте функцию, но выдает исключение в реализации.

В .NET вы обычно используете одно из следующих (есть похожие типы исключений на других языках).

  • NotImplementedException: еще не реализация метода.

  • NotSupportedException: не будет реализацией метода в этом классе, по замыслу. Это появляется несколько раз в виртуальных методах базового класса, где ожидается, что производный класс предложит реализацию, где это применимо. Оно также появляется в явной реализации интерфейса методах (← это конкретная вещь, которую задал интервьюер) , например, ReadOnlyCollection<T> реализация ICollection<T>.Add и т. Д.

Например, в C #:

public void MyNotSupportedInterfaceMethod()
{
  throw new NotImplementedException();
}

ОБНОВЛЕНИЕ: как указывает Маркос, если ваш класс абстрактный, вы можете оставить реализацию наследнику, но вам все равно придется объявить его:

public abstract class MyClass : ISomeInterface
{
   public abstract void MyNotImplementedInterfaceMethod();
}
7 голосов
/ 03 декабря 2009

На эти вопросы всегда сложно ответить, потому что трудно понять, к чему стремился интервьюер. На этот вопрос нет прямого ответа, так как все классы, которые реализуют интерфейс, ДОЛЖНЫ реализовывать его методы. Вы можете задуматься над этим, если ищете код для ответа.

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

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

Все действительны, никто не отвечает на вопрос полностью.

6 голосов
/ 03 декабря 2009

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

class C : IFoo
{
    void IFoo.Foo() {}
}

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

C c = new C();
c.Foo(); // illegal!
IFoo ifoo = c;
ifoo.Foo(); // legal

Если это было то, к чему шел интервьюер, тогда интервьюер должен сделать две вещи.

Во-первых, они должны были сказать «как реализовать интерфейс без раскрытия методов интерфейса в классе?»

Во-вторых, они не должны были задавать вопрос в первую очередь. Плохо сформулированный вопрос, когда интервьюер ищет конкретный ответ, на самом деле мало что говорит о кандидате! Лучшим вопросом на эту тему будет «Как вы решаете, использовать ли явную или неявную реализацию при реализации методов интерфейса?» Это говорит о том, как кандидат принимает технические решения.

4 голосов
/ 03 декабря 2009

Не знаю насчет c #, но в Java вы можете сделать класс абстрактным. Таким образом, вы можете оставить реализацию следующему неабстрактному классу для расширения вашего абстрактного класса.

1 голос
/ 03 декабря 2009

Для меня это вопрос с подвохом. Если ваш класс реализует интерфейс, то он должен реализовывать каждый метод. Если в интерфейсе есть метод, который вы не хотите реализовывать, это означает, что вы не хотите реализовывать этот интерфейс, вы хотите реализовать другой интерфейс, который похож на него.

Очевидно, есть случаи, когда вам нужно реализовать интерфейс, чтобы ваш класс можно было использовать с другим классом или методом. В этих случаях вы должны просматривать класс / метод, который определил этот контракт. Измените его, если можете, если не можете, вы реализуете метод, специфичный для конкретной ситуации (это, вероятно, будет либо ничего не делать, либо выбрасывать исключение), но с осознанием того, что вы на самом деле не выполняете их контракт и в любой момент их код может измениться, что приведет к сбою кода.

0 голосов
/ 03 декабря 2009

Пересмотрите интерфейс, если это возможно, поскольку это является нарушением принципа разделения интерфейса .

РЕДАКТИРОВАТЬ: Если это невозможно, используйте прекрасный ответ Филиппа Лейберта.

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