Trait a konstruktor

Re:Trait a konstruktor
« Odpověď #45 kdy: 23. 12. 2020, 01:25:30 »
Líbí se mi koncept traitů (v Rustu, ve Scale jsem je používal je jako metodu pro vytvoření partial classes), mají tam velkou roli na tom jak jazyk funguje, ale po tom, co jsem viděl na tomto vlákně, musím říci, že něco na tom Golangu bude ;).


Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Trait a konstruktor
« Odpověď #46 kdy: 23. 12. 2020, 11:04:15 »
něco na tom Golangu bude
Bude, hlavně od verze Go 2, která má dostat koncepty.

Re:Trait a konstruktor
« Odpověď #47 kdy: 23. 12. 2020, 13:08:39 »
Dotty (Scala 3) podporuje parametrizované traity. (A také "intersection types", které mohou při práci s traity přijít vhod.)

Hmm, jaký pak zbývá rozdíl mezi trait a class kromě toho, že není možné dědit z více class najednou? Co by se stalo, kdyby se klíčové slovo class zrušilo a používaly se jen tyhle nové traity?

Nevím jak Dotty, ale základní rozdíl mezi dědičností a traity je v té dědičnosti. Když máš objekt O, do kterého přidáš trait T, tak ten objekt O není tím T. (Maximálně tak T obsahuje.) Zatímco když O dědí od předka P, tak O je P.

Jako asi pro tebe nic nového, ale tohle je prostě ten rozdíl 1. To je všechno.



1/ Tak maximálně ještě, že metody z traitu se obvykle nepřetěžují, že se s tím trochu jinak pracuje, a tak.

Mě to zajímá právě v Dotty, jestli tam mohou traity mít parametry při instanciaci, ptám se po rozdílu mezi trait a class, to byla tak poslední věc co class uměla a trait ne. Možná už to budou opravdu jen detaily - Java interop nebo tak, možná mi něco nedochází.

Ve Scale (i pre-Dotty) je totiž možné udělat tohle:

trait Foo {
    def hello(): Unit = {println("Hello, world")}
}

object Main {
    def useFoo(foo: Foo) {
        foo.hello()
    }

    def main(args: Array[String]) = {
        val foo = new Foo {};
        useFoo(foo)
    }
}

V tomhle kontextu mi přijde, že i tvé rozlišení v tom, že class znamená "být" a trait znamená "mít" se smývá, protože pokud něco jsem, tak to i mám, "mít" je silnější.

Re:Trait a konstruktor
« Odpověď #48 kdy: 23. 12. 2020, 16:08:59 »
něco na tom Golangu bude
Bude, hlavně od verze Go 2, která má dostat koncepty.
Koncepty? Trochu nechápu.

Go chybí dle mě: Generika, pořádný sestavovací/balíkovací systém, traity, podmínky jako výrazy jsou v moderních jazycích podmínkou, ne?

Navíc, jak uděláte toto v Go?
Kód: [Vybrat]
struct Point {
    x: i32,
    y: i32,
}

impl fmt::Display for Point {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "({}, {})", self.x, self.y)
    }
}

---
Navíc trait má popisovat nějaké chování, funkce, neměl by obsahovat data.

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Trait a konstruktor
« Odpověď #49 kdy: 23. 12. 2020, 16:29:33 »
něco na tom Golangu bude
Bude, hlavně od verze Go 2, která má dostat koncepty.
Koncepty? Trochu nechápu.
Konepty jako v C++ aka bounded types. Už je preview.


BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Trait a konstruktor
« Odpověď #50 kdy: 23. 12. 2020, 17:12:13 »
Navíc trait má popisovat nějaké chování, funkce, neměl by obsahovat data.

Hele, takhle uvažovat nemůžeš. V jazycích jako je Java, C#, PHP jsou class to, co je v Haskellu type. To co je v Haskellu class je v Java interface... Takže prohlašovat, že v traitu něco být nemá, je takové nepraktické. V zadání bylo co tam bylo. Neupravujme ho.

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Trait a konstruktor
« Odpověď #51 kdy: 23. 12. 2020, 17:21:16 »
V tomhle kontextu mi přijde, že i tvé rozlišení v tom, že class znamená "být" a trait znamená "mít" se smývá, protože pokud něco jsem, tak to i mám, "mít" je silnější.

No samozřejmě. Problém je v tom, že se na to díváš z druhé strany. Já chci do objektu přidat chování a atributy, ale nechci, aby se mi tím změnil typ například. Tedy chci aby zůstalo "mít", ale nezměnilo se "být".

Usecase, které pro traity mám (a které se samozřejmě může lišit jazyk od jazyka):

Mám nějaký objekt. Chci, aby tento objekt měl určité vlastnosti. Buď tam ty vlastnosti dopíšu, nebo je "přidám" pomocí traitu (protože stejné chování jsem dělal jinde). Přičemž vlastnostmi je jak chování (vlastní nějaké metody), tak i data (vlastní nějaké atributy), tak i kategorie (objekt implementuje nějaké rozhraní). A samozřejmě nechci být omezován, takže mohu přidávat kteroukoliv z těchto tří vlastností - ne jak je to u dědičnosti.

Ink

  • *****
  • 658
    • Zobrazit profil
    • E-mail
Re:Trait a konstruktor
« Odpověď #52 kdy: 23. 12. 2020, 19:30:53 »
No samozřejmě. Problém je v tom, že se na to díváš z druhé strany. Já chci do objektu přidat chování a atributy, ale nechci, aby se mi tím změnil typ například. Tedy chci aby zůstalo "mít", ale nezměnilo se "být".

Usecase, které pro traity mám (a které se samozřejmě může lišit jazyk od jazyka):

Mám nějaký objekt. Chci, aby tento objekt měl určité vlastnosti. Buď tam ty vlastnosti dopíšu, nebo je "přidám" pomocí traitu (protože stejné chování jsem dělal jinde). Přičemž vlastnostmi je jak chování (vlastní nějaké metody), tak i data (vlastní nějaké atributy), tak i kategorie (objekt implementuje nějaké rozhraní). A samozřejmě nechci být omezován, takže mohu přidávat kteroukoliv z těchto tří vlastností - ne jak je to u dědičnosti.

Takže ve skutečnosti chceš násobnou dědičnost v jazyku, který ji nemá?

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Trait a konstruktor
« Odpověď #53 kdy: 24. 12. 2020, 00:15:18 »
No samozřejmě. Problém je v tom, že se na to díváš z druhé strany. Já chci do objektu přidat chování a atributy, ale nechci, aby se mi tím změnil typ například. Tedy chci aby zůstalo "mít", ale nezměnilo se "být".

Usecase, které pro traity mám (a které se samozřejmě může lišit jazyk od jazyka):

Mám nějaký objekt. Chci, aby tento objekt měl určité vlastnosti. Buď tam ty vlastnosti dopíšu, nebo je "přidám" pomocí traitu (protože stejné chování jsem dělal jinde). Přičemž vlastnostmi je jak chování (vlastní nějaké metody), tak i data (vlastní nějaké atributy), tak i kategorie (objekt implementuje nějaké rozhraní). A samozřejmě nechci být omezován, takže mohu přidávat kteroukoliv z těchto tří vlastností - ne jak je to u dědičnosti.

Takže ve skutečnosti chceš násobnou dědičnost v jazyku, který ji nemá?

Lze dědit tak, aby potomek nebyl stejného typu jako předek?

+ Tak nějak očekávám a považuji za výhodu, že tu získanou vlastnost nemůžu přetěžovat. Ale zde mám málo zkušeností, nakolik je to podstatná výhoda.

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Trait a konstruktor
« Odpověď #54 kdy: 24. 12. 2020, 00:28:34 »
No samozřejmě. Problém je v tom, že se na to díváš z druhé strany. Já chci do objektu přidat chování a atributy, ale nechci, aby se mi tím změnil typ například. Tedy chci aby zůstalo "mít", ale nezměnilo se "být".

Usecase, které pro traity mám (a které se samozřejmě může lišit jazyk od jazyka):

Mám nějaký objekt. Chci, aby tento objekt měl určité vlastnosti. Buď tam ty vlastnosti dopíšu, nebo je "přidám" pomocí traitu (protože stejné chování jsem dělal jinde). Přičemž vlastnostmi je jak chování (vlastní nějaké metody), tak i data (vlastní nějaké atributy), tak i kategorie (objekt implementuje nějaké rozhraní). A samozřejmě nechci být omezován, takže mohu přidávat kteroukoliv z těchto tří vlastností - ne jak je to u dědičnosti.
Takže ve skutečnosti chceš násobnou dědičnost v jazyku, který ji nemá?
Lze dědit tak, aby potomek nebyl stejného typu jako předek?
To nejde, ale proč by to mělo vadit?

Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:Trait a konstruktor
« Odpověď #55 kdy: 24. 12. 2020, 00:56:14 »
Já chci do objektu přidat chování a atributy, ale nechci, aby se mi tím změnil typ například. Tedy chci aby zůstalo "mít", ale nezměnilo se "být".

Usecase, které pro traity mám (a které se samozřejmě může lišit jazyk od jazyka):

Mám nějaký objekt. Chci, aby tento objekt měl určité vlastnosti. Buď tam ty vlastnosti dopíšu, nebo je "přidám" pomocí traitu (protože stejné chování jsem dělal jinde). Přičemž vlastnostmi je jak chování (vlastní nějaké metody), tak i data (vlastní nějaké atributy), tak i kategorie (objekt implementuje nějaké rozhraní). A samozřejmě nechci být omezován, takže mohu přidávat kteroukoliv z těchto tří vlastností - ne jak je to u dědičnosti.

Můžeš chybějící vlastnosti také injektovat.

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Trait a konstruktor
« Odpověď #56 kdy: 24. 12. 2020, 01:09:04 »
No samozřejmě. Problém je v tom, že se na to díváš z druhé strany. Já chci do objektu přidat chování a atributy, ale nechci, aby se mi tím změnil typ například. Tedy chci aby zůstalo "mít", ale nezměnilo se "být".

Usecase, které pro traity mám (a které se samozřejmě může lišit jazyk od jazyka):

Mám nějaký objekt. Chci, aby tento objekt měl určité vlastnosti. Buď tam ty vlastnosti dopíšu, nebo je "přidám" pomocí traitu (protože stejné chování jsem dělal jinde). Přičemž vlastnostmi je jak chování (vlastní nějaké metody), tak i data (vlastní nějaké atributy), tak i kategorie (objekt implementuje nějaké rozhraní). A samozřejmě nechci být omezován, takže mohu přidávat kteroukoliv z těchto tří vlastností - ne jak je to u dědičnosti.
Takže ve skutečnosti chceš násobnou dědičnost v jazyku, který ji nemá?
Lze dědit tak, aby potomek nebyl stejného typu jako předek?
To nejde, ale proč by to mělo vadit?

To snad ani nebudu rozvádět.

Každopádně pokud to nejde, tak to budiž odpovědí pro @Ink

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Trait a konstruktor
« Odpověď #57 kdy: 24. 12. 2020, 01:56:28 »
No samozřejmě. Problém je v tom, že se na to díváš z druhé strany. Já chci do objektu přidat chování a atributy, ale nechci, aby se mi tím změnil typ například. Tedy chci aby zůstalo "mít", ale nezměnilo se "být".

Usecase, které pro traity mám (a které se samozřejmě může lišit jazyk od jazyka):

Mám nějaký objekt. Chci, aby tento objekt měl určité vlastnosti. Buď tam ty vlastnosti dopíšu, nebo je "přidám" pomocí traitu (protože stejné chování jsem dělal jinde). Přičemž vlastnostmi je jak chování (vlastní nějaké metody), tak i data (vlastní nějaké atributy), tak i kategorie (objekt implementuje nějaké rozhraní). A samozřejmě nechci být omezován, takže mohu přidávat kteroukoliv z těchto tří vlastností - ne jak je to u dědičnosti.
Takže ve skutečnosti chceš násobnou dědičnost v jazyku, který ji nemá?
Lze dědit tak, aby potomek nebyl stejného typu jako předek?
To nejde, ale proč by to mělo vadit?

To snad ani nebudu rozvádět.

Každopádně pokud to nejde, tak to budiž odpovědí pro @Ink
Trait je zobecnění rozhraní, tak to ber tak, že to je stejná "dědičnost" jako implementace rozhraní.

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Trait a konstruktor
« Odpověď #58 kdy: 24. 12. 2020, 02:58:34 »
No samozřejmě. Problém je v tom, že se na to díváš z druhé strany. Já chci do objektu přidat chování a atributy, ale nechci, aby se mi tím změnil typ například. Tedy chci aby zůstalo "mít", ale nezměnilo se "být".

Usecase, které pro traity mám (a které se samozřejmě může lišit jazyk od jazyka):

Mám nějaký objekt. Chci, aby tento objekt měl určité vlastnosti. Buď tam ty vlastnosti dopíšu, nebo je "přidám" pomocí traitu (protože stejné chování jsem dělal jinde). Přičemž vlastnostmi je jak chování (vlastní nějaké metody), tak i data (vlastní nějaké atributy), tak i kategorie (objekt implementuje nějaké rozhraní). A samozřejmě nechci být omezován, takže mohu přidávat kteroukoliv z těchto tří vlastností - ne jak je to u dědičnosti.
Takže ve skutečnosti chceš násobnou dědičnost v jazyku, který ji nemá?
Lze dědit tak, aby potomek nebyl stejného typu jako předek?
To nejde, ale proč by to mělo vadit?

To snad ani nebudu rozvádět.

Každopádně pokud to nejde, tak to budiž odpovědí pro @Ink
Trait je zobecnění rozhraní, tak to ber tak, že to je stejná "dědičnost" jako implementace rozhraní.

To nedává smysl. Já nemám zájem o zobecněné rozhraní. Já nemám zájem o vynucenou dědičnost (rozhraní přináší do typu zařazení do kategorie, to nemusím chtít). Nevím, proč bych to tak měl brát.

Pokud mé chápání výrazu "trait" je posunuté, budiž, to je samozřejmě možné. V tom případě si v mé otázce to slovo škrtni a nech tam toto:
Mám nějaký objekt. Chci, aby tento objekt měl určité vlastnosti. Buď tam ty vlastnosti dopíšu, nebo je "přidám" pomocí traitu (protože stejné chování jsem dělal jinde). Přičemž vlastnostmi je jak chování (vlastní nějaké metody), tak i data (vlastní nějaké atributy), tak i kategorie (objekt implementuje nějaké rozhraní). A samozřejmě nechci být omezován, takže mohu přidávat kteroukoliv z těchto tří vlastností - ne jak je to u dědičnosti.
« Poslední změna: 24. 12. 2020, 03:04:15 od BoneFlute »

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Trait a konstruktor
« Odpověď #59 kdy: 24. 12. 2020, 04:51:31 »
No samozřejmě. Problém je v tom, že se na to díváš z druhé strany. Já chci do objektu přidat chování a atributy, ale nechci, aby se mi tím změnil typ například. Tedy chci aby zůstalo "mít", ale nezměnilo se "být".

Usecase, které pro traity mám (a které se samozřejmě může lišit jazyk od jazyka):

Mám nějaký objekt. Chci, aby tento objekt měl určité vlastnosti. Buď tam ty vlastnosti dopíšu, nebo je "přidám" pomocí traitu (protože stejné chování jsem dělal jinde). Přičemž vlastnostmi je jak chování (vlastní nějaké metody), tak i data (vlastní nějaké atributy), tak i kategorie (objekt implementuje nějaké rozhraní). A samozřejmě nechci být omezován, takže mohu přidávat kteroukoliv z těchto tří vlastností - ne jak je to u dědičnosti.
Takže ve skutečnosti chceš násobnou dědičnost v jazyku, který ji nemá?
Lze dědit tak, aby potomek nebyl stejného typu jako předek?
To nejde, ale proč by to mělo vadit?

To snad ani nebudu rozvádět.

Každopádně pokud to nejde, tak to budiž odpovědí pro @Ink
Trait je zobecnění rozhraní, tak to ber tak, že to je stejná "dědičnost" jako implementace rozhraní.

To nedává smysl. Já nemám zájem o zobecněné rozhraní. Já nemám zájem o vynucenou dědičnost (rozhraní přináší do typu zařazení do kategorie, to nemusím chtít). Nevím, proč bych to tak měl brát.

Pokud mé chápání výrazu "trait" je posunuté, budiž, to je samozřejmě možné. V tom případě si v mé otázce to slovo škrtni a nech tam toto:
Mám nějaký objekt. Chci, aby tento objekt měl určité vlastnosti. Buď tam ty vlastnosti dopíšu, nebo je "přidám" pomocí traitu (protože stejné chování jsem dělal jinde). Přičemž vlastnostmi je jak chování (vlastní nějaké metody), tak i data (vlastní nějaké atributy), tak i kategorie (objekt implementuje nějaké rozhraní). A samozřejmě nechci být omezován, takže mohu přidávat kteroukoliv z těchto tří vlastností - ne jak je to u dědičnosti.
Moc to komplikuješ, tohle je jako chtít auto s hranatýma kolama, co nedrncá.