V Rustu, pokud vím, trait nemá fieldy. Proč je tam potřebuješ mít, patří tam vůbec?
Předpokládejme, že ano.
Motivace traitů, tak jak o ní v tomto vlákně mluvím, je komponovat "objekt" z částí. Tedy něco na co se zneužívá dědičnost, ale bez nevýhod dědičnosti.
Eee?! Tomu co vidím tady https://forum.root.cz/index.php?topic=24024.msg341967#msg341967 se říká kompozice a traity k tomu nepotřebuju. Traity mi k objektu přimíchají další chování aniž bych si musel uložit do fieldu jejich instance.
Ee, kompozice v kontextu OOP je trochu něco jiného. Já chci, aby výsledek bylo toto:
UserAcount = {
login: String
password: Password
email: Email
name: String
surname: String
roles: [Role]
permissions: [Permission]
extraPermissions: [Permission]
}
Jestli tomu budeme říkat traity, nebo jinak je mi celkem jedno.
Zatím jsme tu probrali, zda to je či není dobrý nápad.
Takže ještě k mé otázce - jak tyto vlastnosti inicializovat, případně když ta inicializace má nějakou komplexní logiku. Proč by to měl být problém souvisí poněkud s tím, že ty fieldy z traitu jsou privátní, mají nějaký provázaný stav, který by si měl hlídat ten trait.
Souhlasím, že construktory by měly být součástí rozhraní. Vlastně bych kostruktory nejradši zrušil a zavedl místo nich kategorii pro faktory metody a těm umožnil být (volitelně) součástí do rozhraní/traitu. Fieldy mi v traitech nevadí. S dynamických dispatch by to byl super jazyk.
Pragmaticky a přitom docela dobře to má udělané Groovy http://docs.groovy-lang.org/next/html/documentation/core-traits.html
Na to groovy jsem koukal, a nenašel jsem tam ukázku, jak se ty fieldy inicializují.
Pro demonstraci předpokládáme situaci, kdy do existující třídy přidáme nový trait, takže musím přepsat konstruktory té třídy, to se má samo sebou. Otázka je, jak to bude vypadat.