Wpis z mikrobloga

W programowaniu obiektowym ważne są dwie relacje: klasa może być podklasą innej klasy i obiekt może być instancją klasy. Można utworzyć dowolnie długi (pomijając ograniczenia pamięci) ciąg podklas. Natomiast obiekt, który jest instancją klasy, sam nie jest już raczej klasą z instancjami.

Czy istnieje jakiś język programowania, w którym możliwy jest dowolnie długi ciąg instancji?

Drugi obrazek w komentarzu.

#programowanie #programista15k #linux #komputery
pyroxar - W programowaniu obiektowym ważne są dwie relacje: klasa może być podklasą i...

źródło: IMG_1602

Pobierz
  • 18
  • Odpowiedz
@pyroxar: Nie rozumiem pytania. W ogóle po co to? Dowolnie długi ciąg instancji to przecież po prostu lista obiektów. To miałeś na myśli?

A z drugiego rysunku to jak piszesz "klasa klas", to obczaj typy generyczne, type-classes i higher-kinded-types. To jest użyteczne ale raczej na zaawansowanym poziomie programowania. I tradycyjne języki OOP jak Java/C# są mega słabe w te klocki.
  • Odpowiedz
@pyroxar: Nie rozumiem rysunku nr 2 ale może chodzi Ci o cos takiego jak szablon, czyli taka klasa w która mozna wsadzić inna klasę i prawie dowolnie je łaczyć. Tworząc instancje wybierasz taka klasę szablon oraz inne klasy które wypełnią miejsce w tym szbalonie i uzyskujesz całkiem nową klasę której obiekty możesz tworzyć
  • Odpowiedz
@pyroxar: No chociażby Python, gdzie obiekt type jest dla siebie swoją własną instancją. Poczytaj o metaclass, ale to tylko tak naprawdę syntactic sugar.

Generalnie języki gdzie klasa sama w sobie jest obiektem i to dokładniej to się nazwa "first class object", nie wiele jest takich języków.
  • Odpowiedz
@pyroxar ten drugi obrazek WTF?

"klasa która jest obiektem"? WTF? To się zdecyduj: klasa czy obiekt.

"klasa --instancja--> klasa"? WTF? Z instancji powstaje obiekt, nie klasa.

Ale rozumiem o co ci chodzi. Potrzebujesz metaprogramowania. Musisz dynamicznie tworzyć klasy. W Javie w refleksji masz obiekty klasy Class, które reprezentują klasy. Ale nie możesz tworzyć nowych klas.

W Javie metaprogramiwania nie umożliwia Java. Możesz użyć jedynie adnotacji i preprocesora. Ale nadal to nie będzie
  • Odpowiedz
metaclass, ale to tylko tak naprawdę syntactic sugar


@zibizz1 metaprogramowanie to nie tylko syntactic sugar. Przykładowo Java nie umożliwia metaprogramowania. Sam język musi to umożliwiać.

A to że metaprogramowanie może być opakowane w ładną skłanię to już drugorzędne.
  • Odpowiedz
@mk321: No ja mówię o Pythonie, gdzie metaclassy są zaimplementowane w ten sposób, że powstała klasa staje się instancją tej metaklasy.

Natomiast OPowi nie chodzi o metaprogramowanie tylko o języki, w który klasy są traktowane jak first class object.
  • Odpowiedz
@pyroxar:
???

[11] pry(main)> class Dupa
[11] pry(main)* def initialize
[11] pry(main)* puts self.class
[11] pry(main)* end
[11] pry(main)* end

[17] pry(main)> Dupa.new.class.new.class.new.class.new.class.new
Dupa
Dupa
Dupa
Dupa
Dupa
=> #<Dupa:0x0000000100935408>
  • Odpowiedz