Re[16]: Breaking change
От: xpalex  
Дата: 14.12.22 10:37
Оценка: 41 (1) +1
Здравствуйте, 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; // можно не копировать, т.к. мы не даем методов модификации текущей коллекции
  }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.