Статика в интерфейсе
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
Смотрите также
-
реализация по умолчанию,
которая задаёт обычное тело метода интерфейса -
static,
который объявляет член без экземпляра -
реализация интерфейса,
которая связывает класс с контрактом -
typeof,
который получает объект типаType