Что такое интерфейс в C#
Содержание
Что такое интерфейс?
- Интерфейс похож на чистый абстрактный класс, который содержит только абстрактные методы
- Детский класс должен обеспечить реализацию для всех методов родительского интерфейса
- Однако объект интерфейса не может быть создан, ссылка на объект интерфейса может быть создана
- Все методы в интерфейсе являются общедоступными и абстрактными по умолчанию
- Ссылка на объект родительского интерфейса может указывать на объект дочернего класса
- В списке Inheritance родителям класса должны следовать родители интерфейса
- Члены интерфейса:
- методы
- свойства
- индексаторах
- Мероприятия
- Интерфейс не может содержать:
- Константы
- поля
- операторы
- Конструкторы
- деструкторы
- Все члены интерфейса являются общедоступными
- Интерфейс может наследовать другой интерфейс
- Интерфейс не может быть создан
- Модификатор доступа не может быть указан для члена интерфейса
Пример:
using System.Collections.Generic; using System.Linq; using System.Text; using System; namespace InterfaceApplication { public interface ITransactions { // interface members void showTransaction(); double getAmount(); } public class Transaction : ITransactions { private string tCode; private string date; private double amount; public Transaction() { tCode = " "; date = " "; amount = 0.0; } public Transaction(string c, string d, double a) { tCode = c; date = d; amount = a; } public double getAmount() { return amount; } public void showTransaction() { Console.WriteLine("Transaction: {0}", tCode); Console.WriteLine("Date: {0}", date); Console.WriteLine("Amount: {0}", getAmount()); } } class Tester { static void Main(string[] args) { Transaction t1 = new Transaction("001", "2/5/2016", 28300.00); Transaction t2 = new Transaction("002", "2/5/2016", 152900.00); t1.showTransaction(); t2.showTransaction(); Console.ReadKey(); } } }
Когда приведенный выше код компилируется и выполняется, он производит следующий результат:
Transaction: 001 Date: 2/5/2016 Amount: 28300 Transaction: 002 Date: 2/5/2016 Amount: 152900
Интерфейс или абстрактный базовый класс?
При разработке иерархии классов вам часто приходится решать, должны ли классы в корневой иерархии (родительские классы) быть абстрактными базовыми классами, или
же реализовать конкретные классы в терминах интерфейсов.
Вот некоторые рекомендации, которые помогут принять это решение.
В пользу интерфейсов:
- Будут ли классы внедрять несколько базовых классов? Это невозможно в C#, но возможно реализовать несколько интерфейсов.
- Разделяете ли вы озабоченность до того момента, когда вы понимаете разницу между тем, что ваш класс и что он делает? Интерфейсы часто связаны с тем, что
делает класс, тогда как базовый класс может закрепить его. - Интерфейсы часто не зависят от класса и могут использоваться во многих ситуациях.
Их можно добавить в класс, не заботясь о том, что это такое. - Интерфейсы часто допускают очень слабо связанную конструкцию.
- Вывод слишком большого количества вещей из базового класса может привести к тому, что он будет раздуваться со слишком
большой функциональностью.
В пользу базовых классов:
- Существует ли разумная общая функциональность или данные для всех производных типов? Может быть полезен абстрактный базовый класс.
- Реализация одного и того же интерфейса по многим типам может привести к многократному повторению кода, тогда как абстрактный базовый класс может группировать общий код в единую реализацию.
- Абстрактный базовый класс может обеспечить реализацию по умолчанию.
- Абстрактные базовые классы имеют тенденцию жестко структурировать код. Это может быть желательно в некоторых случаях.
Понимание взаимосвязи между классами и интерфейсами
Класс расширяет другой класс, интерфейс расширяет другой интерфейс, но класс реализует интерфейс.