Войти
ФлеймФорумПрограммирование

Интерфейсы в C# 8.0

Страницы: 1 2 3 4 5 6 7 Следующая »
#0
17:17, 3 сен. 2019

Поясните, кто в теме, зачем это стало возможным?

interface MyFckngCode
{
    void DoStuff(); // Просто метод - это было до 8.0
    void DoMoreStuff() => Console.WriteLine("Hello!"); // Метод с дефолтной реализацией
    private void DoSomePrivate() => Console.WriteLine("shh..."); // Приватный? метод интерфейса
    public int OhShi { get; set; } // Публичное??? свойство... а что, нельзя без public обойтись?
    abstract void DoStuffAgain(); // Абстрактный... помните, мы всё ещё в интерфейсе?
    static void Blah() => Console.WriteLine("kill me please"); // Уже не удивляет
}

Вот ссылка на статью, в которой человек что-то пытается объяснить на буржуйском, но у него плохо выходит самому понять суть:  https://jeremybytes.blogspot.com/2019/09/interfaces-in-c-8-are-bit-of-mess.html

Зачем это всё? Как этим пользоваться и как с этим жить?


#1
17:35, 3 сен. 2019

Уже ведь в предыдущей теме 10 раз объяснили. Опять тот же вопрос...

#2
17:42, 3 сен. 2019

pahaa
Дай ссылку что ли на "предыдущую тему"

#3
(Правка: 20:08) 20:07, 3 сен. 2019

Ссылка на «предыдущую тему»

#4
21:06, 3 сен. 2019

Если кратко: реализацию по умолчанию для методов интерфейсов разрешили, чтобы авторы публичных библиотек могли эти интерфейсы в будущем расширять.

Например, ты написал интерфейс IList, выложил свою библиотеку в публичный доступ, и люди начали ей пользоваться, в том числе реализовывать этот интерфейс в своих типах. А потом ты захотел добавить в IList новый метод Foo. В текущих версиях C# ты не можешь его добавить, потому что будет breaking change. У всех людей, кто у себя этот интерфейс уже реализовывал, код перестанет комилироваться, потому что в их коде отсутствует реализация для метода IList.Foo.

#5
21:26, 3 сен. 2019

Нихао
> Поясните, кто в теме, зачем это стало возможным?

В С++ нету интерфейсов, зачем они были нужны в C# неясно.
Тру интерфейсы есть только в COM.

#6
(Правка: 21:51) 21:50, 3 сен. 2019

gamedevfor
> зачем они были нужны в C# неясно.
> Тру интерфейсы есть только в COM.
C# они нужны, как-минимум, чтобы уметь в COM.
иначе C# бы в DX не умел бы. (критический функционал, с точки зрения геймедва).
Хотя под виндой дофига API, которое только через COM, не имея C аналогов. 

#7
(Правка: 22:02) 22:00, 3 сен. 2019

skalogryz
С++ умеет в DX без интерфейсов, а С# не смог бы? Не верю.

#8
22:32, 3 сен. 2019

alexzzzz
> Если кратко: реализацию по умолчанию для методов интерфейсов разрешили, чтобы авторы публичных библиотек могли эти интерфейсы в будущем расширять.
А зачем авторам публичных библиотек расширять интерфейсы? Интерфейс - это контракт, реализуемый моим кодом. Если я реализую интерфейс IList - то у меня есть метод Add, который может где-то использоваться в коде автора этого интерфейса. Если автор интерфейса возьмёт и добавит в него метод, например, GetCount, _моей_ реализации GetCount внезапно у моего класса не появится, а автор IList понятия иметь не может, как самостоятельно реализовать GetCount для моего класса.

#9
22:42, 3 сен. 2019

gamedevfor
> С++ умеет в DX без интерфейсов, а С# не смог бы? Не верю.
C++ в DX без интерфейсов?... через абстрактные классы что ле?

#10
(Правка: 22:50) 22:48, 3 сен. 2019

skalogryz
> C++ в DX без интерфейсов?... через абстрактные классы что ле?

через абстрактные структуры (но это скорее всего из-за того чтобы можно было COM позвать не только из C++ но из Cи также)

#11
(Правка: 23:48) 23:10, 3 сен. 2019

gamedevfor
> через абстрактные структуры (но это скорее всего из-за того чтобы можно было
> COM позвать не только из C++ но из Cи также)
абстрактные структуры... честно говоря, не встречал такой термин.

Полагаю, что ты просто хочешь сказать, что интерфейс есть не более, чем структура с указателями на некие методы.
а COM интерфейсы, в довесок ко всему, диктуют, что у каждой такой структруы есть 3 обязательных метода: QueryInterface, AddRef и Release.

И то что, в С это "абстрактные структуры", а в С++ интерфейс/абстрактный класс, в других языках будет COM-интерфейсом, ибо понятие об объектах у этих языков может быть своим.

https://docs.microsoft.com/en-us/windows/win32/direct3d12/interface-hierarchy
нигде слово "абстрактные структуры" не упоминается, везде interface... interface... interface...

"Интерфейсы" технически крайне удобны своей примитивностью, с точки зрения реализации в других языка.
Точно так же, как и Си-вызовы.
Не надо морочить себе голову со всякими vm-таблицами. Фиг ли, стандарта-то нет, и компиляторы крестов на бинарном уровне друг с другом не совместимы.
А КОМ интерфейсы, кроме прочего позволяют контролировать "время" жизни интерфейса (AddRef /Release), и автоматизируют получение информации о поддерживаемых возможностях (QueryInterface)
#12
23:36, 3 сен. 2019

skalogryz
> абстрактные структуры... честно говоря, не встречал такой термин.

#define __STRUCT__ struct
#define interface __STRUCT__
typedef interface ID3D12Device1 ID3D12Device1;

Ну да типа интерфейс но под капотом struct

#13
(Правка: 0:36) 0:34, 4 сен. 2019

Нихао
> А зачем авторам публичных библиотек расширять интерфейсы? Интерфейс - это
> контракт, реализуемый моим кодом. Если я реализую интерфейс IList - то у меня
> есть метод Add, который может где-то использоваться в коде автора этого
> интерфейса. Если автор интерфейса возьмёт и добавит в него метод, например,
> GetCount, _моей_ реализации GetCount внезапно у моего класса не появится, а
> автор IList понятия иметь не может, как самостоятельно реализовать GetCount для
> моего класса.

Это будет уже проблема автора библиотеки, как и что он собирается добавлять. Если он к Add добавит AddRange, почему бы и нет:

public interface IList<T>
{
       void Add(T item);
       void AddRange(IList<T> items) => foreach (var item in items) Add(item);
}

Ты потом в своём коде можешь сделать более эффективную реализацию AddRange под конкретно твой случай.

gamedevfor
> В С++ нету интерфейсов, зачем они были нужны в C# неясно.

В C# отказались от множественного наследования, позволив вместо этого реализацию типом множества интерфейсов.

#14
0:41, 4 сен. 2019

alexzzzz
> В C# отказались от множественного наследования, позволив вместо этого
> реализацию типом множества интерфейсов.

Вот этот маразм меня всегда удивлял.

Страницы: 1 2 3 4 5 6 7 Следующая »
ФлеймФорумПрограммирование