wizzard: (Default)
wizzard ([personal profile] wizzard) wrote2009-12-15 10:37 am

c# ramblings

почему в интерфейсе не может быть конструкторов? аррргх.

насчет “в языке нету синтаксиса” – делается на раз-два. ISomeType something= new<ISomeType> typeVariable(arg, arg2, arg3), например. И статический чекинг, и все тут, и не конфликтует ни с чем.

без синтаксиса делается тоже на раз-два, либо фабриками, либо рефлекшеном, но некрасиво это :/

У меня ностальгия по питоновой общности между constructors, factories и вообще callables…

[identity profile] mr-aleph.livejournal.com 2009-12-15 08:48 am (UTC)(link)
а зачем интерфейсу конструктор?

[identity profile] mr-aleph.livejournal.com 2009-12-15 08:56 am (UTC)(link)
wow, cool idea.

только это не для интерфесов, а скорее для трейтов фича...

[identity profile] mr-aleph.livejournal.com 2009-12-15 09:22 am (UTC)(link)
я опять чего-то нагнал.

я думал Scala traits поддерживают такую фичу, как ты хотел... но оказывается нет.

для меня трейт был "статическим требованием на тип: т.е. списком методов с сигнатурами, которые класс обязан объявлять"

но тогда непонятно, чем это отличается от констрейнтов...

[identity profile] insooo.livejournal.com 2009-12-15 09:35 am (UTC)(link)
Степанов в своей недавней книжке описывает трейт типа как "набор свойств типа примитивных в контексте алгоритма в котором тип может учавствовать".)

[identity profile] alexey-rom.livejournal.com 2009-12-15 11:29 pm (UTC)(link)
Насколько я понимаю, это type traits в C++. С traits в Scala/Smalltalk/etc. просто случайное совпадение названия.

[identity profile] alexey-rom.livejournal.com 2009-12-15 11:28 pm (UTC)(link)
Traits в Scala происходят от Smalltalk (с попытками их добавить в Java/C# и Ruby mixins по дороге). Это, грубо говоря, интерфейс + (частичная) реализация. Отличие от абстрактных классов в том, что допускается множественное наследование от трэйтов, у них нет конструкторов и т.д.

[identity profile] hydrargentum.livejournal.com 2009-12-15 10:18 am (UTC)(link)
Классы свойств объединяют полезные типы и константы, в применении к шаблонным параметрам обеспечивающие дополнительный уровень косвенности.

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

(C) Джоасатис & Водервурд - Шаблоны С++, Классы Свойств и Стратегий.

[identity profile] shadow-aka-hf.livejournal.com 2009-12-15 09:51 am (UTC)(link)
>классу, реализующему данный интерфейс, иметь конструктор с данной сигнатурой

Зачем?

[identity profile] shadow-aka-hf.livejournal.com 2009-12-15 10:00 am (UTC)(link)
Точнее так: зачем эта возможность именно в интерфейсе, который есть требования к уже существующему объекту?

[identity profile] shadow-aka-hf.livejournal.com 2009-12-15 06:19 pm (UTC)(link)
Ну, да. Но случай не очень частый.
Можно требовать необходимый конструктор в рантайм.

[identity profile] shadow-aka-hf.livejournal.com 2009-12-16 10:22 am (UTC)(link)
Удобно, но в логику интерфейсов это плохо укладывается. К тому же, удобно у всех свое.

[identity profile] alexey-rom.livejournal.com 2009-12-15 11:18 pm (UTC)(link)
Согласен!

+ констрейнты на конструкторы с аргументами.

+ трейты.

+ тайпклассы.

А ещё таблеток от жадности.

[identity profile] alexey-rom.livejournal.com 2009-12-15 11:38 pm (UTC)(link)
Dictionary passing нам поможет (добавить аналог тайпклассов в C# даже без поддержки на уровне CLR). См. статью JavaGI: Generalized Interfaces for Java

[identity profile] 109.livejournal.com 2009-12-22 01:35 am (UTC)(link)
+ static virtual methods. или хотя бы static abstract (во щас флейм развернётся!)

[identity profile] 109.livejournal.com 2009-12-22 10:46 am (UTC)(link)
ага, даже в Дельфи метаклассы более осмысленные. а уж то, что в шарпе нельзя вызвать static method у инстанса, это вообще retarded.

[identity profile] alexey-rom.livejournal.com 2009-12-15 11:34 pm (UTC)(link)
А ответ на сам вопрос простой. Потому же, почему в интерфейсе не может быть статических методов (чего мне тоже регулярно хочется). Конструкторы не наследуются и в таблицу виртуальных методов не входят.

[identity profile] 109.livejournal.com 2009-12-22 01:30 am (UTC)(link)
формально: в интерфейсе не может быть конструкторов по той же причине, что и статических методов. потому что конструктор - это не instance method.

по существу: пример не понял. что такое typeVariable?

[identity profile] 109.livejournal.com 2009-12-22 10:41 am (UTC)(link)
а, ну это хорошо бы и безотносительно интерфейсов иметь. totally integrated metadata. и чтобы статические методы класса являлись инстанс методами метакласса, для полноты.