Создаем портфолио за 1 месяц
К концу месяца: 4 классных проекта в вашем портфолио! Стоимость: 100$. Подробности...
1074 of 1492 menu
◀ ▶

Статика в интерфейсе

static abstract член обязан реализовать каждый тип, который реализует интерфейс. static virtual задаёт реализацию по умолчанию, которую тип может перекрыть. Вызов статического контракта выполняют через имя реализующего типа, а не через переменную интерфейса.

Синтаксис

interface IFactory<T> where T : IFactory<T> { static abstract T Create(); }

Пример

Давайте реализуем static abstract и вызовем через тип:

using System; interface IFactory<TSelf> where TSelf : IFactory<TSelf> { static abstract TSelf Create(); } class Item : IFactory<Item> { public string Code = "abcde"; public static Item Create() { return new Item(); } } class Program { static void Main() { var res = Item.Create(); Console.WriteLine(res.Code); } }

Результат выполнения кода:

"abcde"

Пример

Давайте используем static virtual с перекрытием в типе:

using System; interface ILabel { static virtual string DefaultLabel() { return "12345"; } } class Tag : ILabel { public static string DefaultLabel() { return "abcde"; } } class Program { static void Main() { Console.WriteLine(Tag.DefaultLabel()); } }

Результат выполнения кода:

"abcde"

Пример

Давайте сравним вызов через тип и через интерфейс с ограничением:

using System; interface INumber<TSelf> where TSelf : INumber<TSelf> { static abstract int Zero(); } class Num : INumber<Num> { public static int Zero() { return 0; } } class Program { static void Main() { Console.WriteLine(Num.Zero()); } }

Результат выполнения кода:

0

Смотрите также

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить