2013-02-15 4 views
0

Я читал некоторую теорию кода, связанную с множественным наследованием и интерфейсами. Он сказал во всех местах, что interface is a class without implementation.Почему «интерфейс не имеет реализации»? - C#

1) В чем заключается использование не реализованных методов/функций в интерфейсе? Поддерживает ли он несколько реализаций одного и того же метода в разных классах, которые наследуют интерфейс?

2) Большинство примеров кода, похоже, показывают методы интерфейса void. Всегда ли интерфейсные функции/методы void?

+0

Вы должны попытаться найти немного, прежде чем оставлять вопрос: [здесь] (http://stackoverflow.com/questions/3844200/interfaces-in-c-sharp) –

+1

(1) В основном, да. (2) Не обязательно; вы можете иметь непустые методы, свойства, события ... – Rawling

+0

Возможно, немного фона: C# не имеет множественного наследования типа c. В C вы могли иметь базовый класс с некоторыми методами, 2 (или более) дочерних класса базового класса, а затем «большой» дочерний класс, наследование которого от обоих дочерних классов. Это обычно называют «проблемой алмаза». Должен ли внук вести себя как один из детей, и какой из них? java и C# пытаются избежать проблем из этого созвездия, используя «абстрактный» класс, который является интерфейсом. вы можете реализовать некоторые интерфейсы, но не можете наследовать более одного класса. – Offler

ответ

1

К вопросу 1: да, это одна из причин использования интерфейсов. Интерфейсы часто используются как API для компонента. Фактическая реализация может быть неизвестна потребителю, поддерживая свободную связь и тестируемость посредством модульных тестов.

Что касается вопроса 2: нет, методы интерфейса могут иметь такие же сигнатуры методов, что и методы класса.

+0

Спасибо. Можете ли вы привести пример последней причины: * «Фактическая реализация может быть неизвестна потребителю, поддерживая свободную связь и проверяемость посредством модульных тестов». *? – aspiring

+0

Свободная муфта в основном используется с контейнерами для инъекций Dependency, такими как Castle Windsor, Unity, NInject или Spring Framework. Чтобы получить общее представление о DI (или «Инверсия управления как более общее имя для шаблона»), вы должны посмотреть несколько руководств, например: http://joelabrahamsson.com/entry/inversion-of-control-introduction- с примерами-в-dotnet. Что касается проверяемости: единичные тесты должны тестировать только один блок, поэтому испытанный компонент, который полагается (может быть, много) других компонентов, будет трудно проверить автономно. Используя насмешливые фреймворки или заглушки, вы можете упростить модульное тестирование. –

+0

Хорошо, что выходит за рамки моей шляпы :) Я посмотрел на [этот учебник] (http://www.codeproject.com/Tips/389019/Why-Csharp-interface-inheritance-makes-sense-see -L) в терминах 'интерфейс наследования' не на LinQ. Однако большинство статей утверждают, что «классы реализуют интерфейсы» вместо «классов, наследуемых от интерфейсов». Подобно тому, что вы упомянули в одном из своих комментариев. Итак, какова правильная норма? реализует или наследует? Если да, то почему эта статья говорит наследует? – aspiring

1

1) Каково использование не реализованных методов/функций в интерфейсе ? Is он поддерживает несколько реализаций одного и того же метода в разных классах, которые наследуют интерфейс?

ДА.

2) Большинство образцов кода, похоже, показывают интерфейс void . Являются ли интерфейсные функции/методы неизменными?

Нет. Совсем нет. Он может вернуть что угодно.

+0

Спасибо. В первом случае я все еще могу написать родительский класс и наследовать его один конкретный метод и реализовать его по-разному в нескольких дочерних классах. Мне это удалось. Итак, в чем преимущество использования этих методов в интерфейсе (кроме попыток обхода обхода множественного наследования)? :) – aspiring

+0

@aspiring, ну ваш вопрос должен быть Зачем использовать интерфейс? , вы уже упоминали одну из причин в своем комментарии, интерфейс фактически определяет контракт и полезен при полиморфизме. Вам нужно больше узнать о концепции, это может быть хорошим началом http://www.cs.utah.edu/~germain/PPS/Topics/interfaces.html – Habib

+0

Спасибо :) полезно, вся помощь и статьи. – aspiring

1

Для 1) Да, ваша идея верна. Предположим, у вас есть интерфейс, который имеет только какой-то метод makeSound. Теперь вы можете реализовать этот интерфейс в классе Guitar и в некотором классе Drums. Вы только должны знать в своей программе, что у вас есть объект, который реализует makeSound, чтобы вы могли вызвать этот метод. Не нужно знать, каков будет фактический выход/звук.

Для 2) Нет, интерфейс может содержать методы с любой сигнатурой.

+0

Значит, вы похожи на метод 'Draw()' в классе 'Graphics'? Но тогда «Guitar» должен дать гитарный звук, и так далее «Drums». Говорить, когда реализован метод 'makeSound', он будет воспринимать реализацию дочернего класса? если он был 'makeShape', он будет иметь форму дочернего класса? – aspiring

+1

Это займет наилучшую реализацию. Если вы «переопределите» реализацию, это будет выполнено. Поскольку 'Guitar' и' Drums' не наследуются друг от друга, их использование будет использоваться. –

+2

@aspiring не думает о реализации интерфейса как о «дочерних классах». Интерфейс - это просто обещание, что объект, реализующий этот интерфейс, будет иметь метод с именем X с сигнатурой Y. В примере DaDaDoms интерфейс.makeSound будет фактически Guitar.makeSound, если ваш объект является гитарой. И это будет Drums.makeSound, если объект имеет тип Drums. –

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