Здравствуйте, karbofos42, Вы писали:
K>Здравствуйте, _NN_, Вы писали:
K>Эта фича же достаточно узкой выглядит и, на мой взгляд, через неё удобно быстро выкатить новые фишки в продакшон, а вот как это потом поддерживать и дальше расширять?
K>У меня просто не было задач, где это было бы нужно, потому на практике не использовал и тут чисто теоретический взгляд.
Эта фича, особенно в jave, гибрид сишарповых extension methods и с++ специализации.
Т.к. состояние класса в интерфейсе недоступно, реализация дефолтового метода может опираться только на существующий интерфес, что делает ее по возможностям полным аналогом extension method.
Но, конкретные реализации интерфейса, могут уже использовть внутренний стейт и переопределять дефолтовую реализацию более оптимальным образом.
Для c# выглядит оверкиллом. Хотя второй вариант может быть полезен.
interface ICountableEnumerable {
bool next();
int aCount() {
int times = 0;
while(next()) {
times++;
}
return times;
}
}
class List: ICountableEnumerable {
int aCount() { return size; } // более оптимальная реализация
}
interface ICollectionWithFeatures {
IReadonlyCollection asReadonly() {
var copy = ...;// копируем исходный набор данных, что бы call-site не "сломался"
return copy;
}
}
class ReadonlyList: ICollectionWithFeatures, IReadonlyCollection {
IReadonlyCollection asReadonly() {
return this; // можно не копировать, т.к. мы не даем методов модификации текущей коллекции
}
}