Re[2]: Интерфейсы в C# 8 - нафига?
От: Jack128  
Дата: 18.10.19 17:36
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Здравствуйте, Shmj, Вы писали:


S>>Тут пишут, что добавили т.н. дефолтную реализацию: https://habr.com/ru/company/piter/blog/471872/

S>>Зачем?


G>Затем что часто встречается случай:

G>
G>interface IInterface
G>{
G>   public void M(x1); //Calls M(x1, default)
G>   piblic void M(x1, x2); //Calls M(x1, x2, default)
G>   piblic void M(x1, x2, x3);
G>}

G>public class CClass:IInterface
G>{
G>   public void M(x1) { M(x1, default); };
G>   piblic void M(x1, x2) { M(x1, x2, default); };
G>   piblic void M(x1, x2, x3) { ... }
G>}
G>

G>И так во всех классах, реализующих IInterface

G>Это обходили через extension методы, но довольно странное решение получалось. Теперь добавили возможность обходиться без экстеншен методов.


Не-не-не. Это совершено не взаимозаменяемые вещи. Ближайший аналог — это при проектировании класса решить будет ли метод виртуальным или нет. Заменой эктеншном в данном случае будут sealed методы интерфейса.
И то — очень условная, потому что интерф. методы с реализацией в реализуются в классе явно, а значит такой код:
    interface IIntf
    {
        public string GetString();
        public sealed void Print() => Console.WriteLine(GetString());
    }
    public class Impl: IIntf
    {
        public string GetString() => "Str";
    }

    new Impl().Print();

тупо не скомпилируется,
нужно в реализацию каждого класса добавлять public void Print() => ((IIntf)this).Print();
upd: так stack overflow выдает, но вроде была какая то синтаксическая возможность вызвать унаследованную от интерфейса реализацию.
Отредактировано 18.10.2019 18:02 Jack128 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.