Как стать автором
Обновить

Комментарии 6

В чем отличие от абстрактных классов, кроме множественного наследования?

Только публичные методы
Нет конструктора
Нет статичных методов
экземплярные поля использовать по-прежнему нельзя.
есть статичные методы и поля
В этом C# интерфейсы и расходятся с концепцией миксинов (насколько я их понимаю, миксины концептуально могут хранить состояние), но мы все ещё можем достичь изначальной цели

Вот это если что компилируется и работает:


using System;

interface IFoo
{
    protected class TraitState
    {
        public int Bar {get;set;}
        public int Bar2 {get;set;}
    }
    protected TraitState State {get;}
    public int Wat() => State.Bar + State.Bar2;
}

public class C : IFoo 
{
    IFoo.TraitState IFoo.State {get;} = new IFoo.TraitState();
}

Свойство State при этом недоступно потребителям интерфейса, а доступно только реализующим его классам.

Я нахожу такую имплементацию более чистой и удобной для чтения (и поддержки).

А для тестирования юнит-тестами?

Просто нужен отдельный тест для интерфейса. Реализуешь его, и следишь, что дефолтные методы правильно вызывают абстрактные. А потом в реализациях тестируешь только реализацию абстрактных.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации