Здравствуйте, 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 выдает, но вроде была какая то синтаксическая возможность вызвать унаследованную от интерфейса реализацию.