- Интерфейс: интерфейс — это протокол, используемый для определения программы, описывающей набор связанных поведений, которые могут принадлежать любому классу или структуре и могут рассматриваться как шаблон для реализации набора классов. Интерфейс может иметь методы, свойства, события и индексаторы или эти 4 Любая комбинация типов элементов, но не полей.
Классы и структуры могут наследовать от интерфейсов так же, как классы наследуют базовые классы, но могут наследовать от нескольких интерфейсов. Когда классы и структуры наследуют интерфейсы, они наследуют определения элементов, но не реализации. Для реализации членов интерфейса члены в классах и структурах должны быть открытыми, нестатическими и иметь то же имя и сигнатуру, что и член интерфейса. Свойства и индексаторы класса или структуры могут определять дополнительные методы доступа как свойства или индексаторы, определенные в интерфейсе. Например, интерфейс может объявить свойство с доступом к нему get, а класс, реализующий интерфейс, может объявить одно и то же свойство с помощью методов доступа set и get. Однако если свойство или индексатор использует явную реализацию, методы доступа должны совпадать.
Кроме того, интерфейсы могут наследоваться от других интерфейсов, а класс может наследовать интерфейс несколько раз через свой унаследованный базовый класс или интерфейс, и в этом случае класс может реализовать интерфейс только один раз, если интерфейс объявлен как часть нового класса. Если унаследованный интерфейс не объявлен как часть нового класса, его реализация будет предоставлена базовым классом, объявившим его. Базовые классы могут реализовывать члены интерфейса, используя виртуальные члены. В этом случае класс, наследующий интерфейс, может изменить поведение интерфейса, переопределив виртуальные члены.
-
-
-
-
- определить интерфейс
-
-
-
Формат: модификатор доступа (public) ключевое слово (interface) имя интерфейса (начинается с заглавной I)
{
//Может определять только свойства, индексаторы, методы и события
void Print();
string Name{get;set;}
string this[int idx]{get;set}
}
-
-
-
-
- Наследование интерфейсов
-
-
-
Наследование также может быть реализовано между интерфейсами точно так же, как наследование между классами.
Производный интерфейс: базовый интерфейс
{
//
}
Примечание. Интерфейсы могут наследовать интерфейсы, но не классы. Класс имеет один и только один базовый класс, но класс может реализовывать несколько интерфейсов.Если класс реализует интерфейс и унаследованный класс, сначала напишите базовый класс, а затем интерфейс, разделенные запятыми, и унаследованный класс должен быть помещен перед интерфейсом.
-
-
-
-
- Класс реализует интерфейс (когда класс реализует несколько интерфейсов, можно явно реализовать один или несколько методов (с одинаковым именем), реализующих интерфейс)
-
-
-
Если кто-то реализует интерфейс, он должен реализовать все, что определено в интерфейсе.
-
-
-
-
- Интерфейс как параметр метода (формальный параметр)
-
-
-
Любой объект класса, реализующего интерфейс, может быть передан в качестве аргумента вызывающему методу.
-
-
-
-
- Интерфейс как возвращаемый тип метода
-
-
-
Любой объект класса, реализующий интерфейс, может использоваться как возвращаемое значение метода.
Особенности интерфейса:
- Интерфейс подобен абстрактному базовому классу, любой абстрактный тип, наследующий интерфейс, должен реализовывать все члены интерфейса.
- Интерфейсы не могут быть созданы напрямую.
- Интерфейс может содержать события, индексаторы, методы и свойства.
- Интерфейс не может содержать реализации методов.
- Классы и структуры могут наследовать от нескольких интерфейсов.
- Сам интерфейс может наследовать от нескольких интерфейсов.
Примечание: 1. Объявление интерфейса обычно начинается с заглавной буквы I. 2. Когда интерфейс объявлен, все остальное, кроме ключевого слова интерфейса и имени интерфейса, является необязательным. 3. Интерфейсы объявляют интерфейсы с модификаторами, такими как новый, общедоступный, защищенный, внутренний и частный, но члены интерфейса должны быть общедоступными. 4. При наследовании интерфейса необходимо использовать двоеточие (:) между подклассом и интерфейсом Кроме того, если вы наследуете несколько интерфейсов, разделяйте каждый унаследованный интерфейс запятой (,).
Пример 1: Класс реализует интерфейс
public interface IFly
{
void Fly();
string Name { get; set; }
int this[int idx] { get; set; }
}
public class Bird : IFly
{
public void Fly();
public string Name { get; set; }
public int this[int idx] { get; set; }
}
Пример 2: Интерфейс наследуется от интерфейса
public interface IBase
{
void Fly();
}
public interface IFly:IBase
{
new void Fly();
string Name { get; set; }
int this[int idx] { get; set; }
}
Пример 3: Используйте интерфейс для выбора разных языков.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
/// Объявляем интерфейс для определения метода Seak, а реализация конкретной функции метода Speak выполняется в классе
/// </summary>
interface ISelectLanguage
{
void Speak(string str);
}
/// <summary>
/// Если вы разговариваете с китайцем, говорите по-китайски
/// </summary>
class C_SpeakChinese : ISelectLanguage
{
public void Speak(string str)
{
MessageBox.Show("Вы сказали китайским друзьям:" + str, "Подскажите", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
/// <summary>
/// Если вы разговариваете с американцем, говорите по-английски
/// </summary>
class C_SpeakEnglish : ISelectLanguage
{
public void Speak(string str)
{
MessageBox.Show("Вы сказали американским друзьям:" +str, "Напоминание", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void Form1_Load(object sender, EventArgs e)
{
comboBox1.SelectedIndex = 0;
}
public bool CheckChinese(string str)
{
bool flag = false;
UnicodeEncoding a = new UnicodeEncoding();
byte[] b = a.GetBytes(str);
for(int i=0;i<b.Length;i++)
{
i++;
if (b[i] != 0)
{
flag = true;
}
else
{
flag = false;
}
}
return flag;
}
private void button1_Click(object sender, EventArgs e)
{
if (txtContent.Text == "")
{
MessageBox.Show("Не хотите что-то говорить своим друзьям?", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
else
{
If (comboBox1.SelectedIndex == 0)//Диалог с китайцем
{
if (CheckChinese(txtContent.Text))
{
ISelectLanguage Interface1 = new C_SpeakChinese();
Interface1.Speak(txtContent.Text);
}
else
{
MessageBox.Show("Пожалуйста, говорите по-китайски с китайскими друзьями?", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
Остальное//Разговор с американцами
{
if (CheckChinese(txtContent.Text))
{
MessageBox.Show("Пожалуйста, говорите по-английски с американскими друзьями?", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
else
{
ISelectLanguage Interface1 = new C_SpeakEnglish();
Interface1.Speak(txtContent.Text);
}
}
}
}
}
Интерфейс как параметр (формальный параметр) метода: любой объект класса, реализующий интерфейс, может быть передан как фактический параметр вызова метода.
Интерфейс — это возвращаемый тип метода: любой объект класса, реализующего интерфейс, может быть использован в качестве возвращаемого значения метода.
Явная и неявная реализация интерфейсов C#
Реализация интерфейса известна многим, но реализация интерфейса делится на явную реализацию и неявную реализацию, не знаю, многие ли это знают! Но я думаю, что об этом редко упоминают в техническом отделе компании, поэтому я подумал о написании этого блога.
В настоящее время широко используются методы:
public interface IReview
{
void GetReviews();
}
public class ShopReview :IReview
{
public void GetReviews(){}
}
Это скрытая реализация:
IReview rv = new ShopReview();rv.GetReviews();
ShopReview rv = new ShopReview();rv.GetReviews();
Вы можете вызвать метод GetReviews.
Другой способ - показать реализацию:
public interface IReview
{
void GetReviews();
}
public class ShopReview :IReview
{
void IReview.GetReviews(){}
}
Интерфейс реализован таким образом. GetReviews можно вызывать только через интерфейс:
IReview rv = new ShopReview();rv.GetReviews();
Следующий подход будет компилировать ошибки:
ShopReview rv = new ShopReview();rv.GetReviews();
в заключении:
Неявно реализующие интерфейсы и классы доступны
Реализации отображения доступны только через интерфейс.
Показать преимущества
1: Реализация скрытого кода
2: В системе, использующей доступ к интерфейсу, вызывающая сторона может получить к ней доступ только через интерфейсные вызовы, а не базовые классы.
PS: Это может быть применено к системе текущего интерфейса компании + сервисная архитектура. Избегайте, чтобы мы всегда просим всех получить доступ через интерфейс. Потому что без доступа к интерфейсу сейчас не работает
1. Разница между классом C# и интерфейсом
Интерфейс отвечает за определение функций.Проект использует интерфейсы для стандартизации концепций классов, классов операций и абстрактных классов!
Класс отвечает за конкретную реализацию функции!
В классах также есть определения абстрактных классов.Разница между абстрактными классами и интерфейсами заключается в следующем:
Абстрактный класс — это неполный класс, в классе есть абстрактные методы и атрибуты, а также специфические методы и атрибуты, требующие дальнейшей специализации.
Но интерфейс — это спецификация поведения, и в нем все абстрактно!
Класс может наследоваться только от одного базового класса, который является родительским классом, но может реализовывать несколько интерфейсов.
PS: Помимо стандартизации поведения, очень важна и фактическая роль интерфейса в конкретном проекте.В использовании принципов объектно-ориентированного проектирования и шаблонов проектирования отражаются все преимущества использования интерфейса, и наиболее прямой принцип проектирования. В OCP (Open Closed Principle) мы используем интерфейс, не заботясь о его конкретной реализации. Детали конкретного изменения реализации не имеют ничего общего с использованием клиента (класса, использующего интерфейс) Он открыт для расширения, и мы можем написать другой Реализация интерфейса расширяет текущую программу, не влияя на использование верхнего уровня, но закрыта для модификации, то есть мы больше не можем изменять определение интерфейса. Конечно, это «нельзя» означает, что этого делать в принципе не следует.
2. Различия между абстракциями и интерфейсами
A: Абстрактный класс может содержать определения и реализации функций, интерфейсы могут включать только определения функций.
Абстрактный класс — это понятие, абстрагированное от ряда связанных объектов, поэтому оно отражает внутреннюю общность вещей; интерфейс — это функциональный контракт, определенный для удовлетворения внешних вызовов, поэтому он отражает внешние характеристики вещей.
Проанализируйте объект, уточните внутреннюю общность, чтобы сформировать абстрактный класс, который используется для представления сущности объекта, то есть «что есть».
Интерфейс предпочтителен при предоставлении внешних вызовов или функций, которые необходимо расширить.