2009-12-03 2 views
4

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

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

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

Благодаря

+2

Я уверен, что тег «oops» не означает «Я сделал это снова» - но для чего он стоит? Я получаю oop, ood, но это ново для меня. Это опечатка? – Mathias

+0

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

+0

Retagged: OOPS -> OOP –

ответ

13

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

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

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

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

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

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

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

public abstract class MyClass : ISomeInterface 
{ 
    public abstract void MyNotImplementedInterfaceMethod(); 
} 
+0

Но @Philippe, я думаю, что в этом случае мы реализуем его в классе. – Prashant

+0

Нет другого пути. C# не имеет понятия дополнительных методов интерфейса (например, в Objective C, например) –

+0

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

4

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

+0

Верно, но вы все равно должны объявить функцию интерфейса. Конечно, вы не должны его реализовывать. –

7

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

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

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

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

1

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

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

6

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

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

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

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

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

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

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

+2

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

0

Пересмотрите интерфейс, если это возможно, так как это является нарушением Interface Segregation Principle.

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

Смежные вопросы