Temat: Zalety i wady mixinów

Z jednej strony większe możliwości niż interfejsy bo są metody wraz z implementacją. Z drugiej strony nie ma pół składowych tylko same metody. Jak w takim razie wykonać coś takiego: mam klasę kontrolki, chcę ją rozszerzyć o możliwość rysowania po niej?

konto usunięte

Temat: Zalety i wady mixinów

Andrzej Borucki:
nie ma pół składowych tylko same metody.

Serio?

Temat: Zalety i wady mixinów

Nie znam Rubiego, interesuję się programowaniem obiektowym.
Opierałem się na http://pl.wikibooks.org/wiki/Ruby/Modu%C5%82y gdzie jest:
"Moduły w Rubim są podobne do klas, ale:
Moduł nie może mieć instancji.
Moduł nie może mieć podklas."
"Istnieją dwa typowe zastosowania modułów. Jedno to zebranie powiązanych metod i stałych w jednym centralnym miejscu"
Pola związane są z instancją, chyba że to jakoś inaczej urządzone. Czy jest tak że deklaruje się składowe, które po dołączeniu do klasy staną się jakby składowymi tej klasy? Jak można rozwiązać przypadek kontrolek z rysowaniem i czym to się różni od wielokrotnego dziedziczenia?

konto usunięte

Temat: Zalety i wady mixinów

module Named
attr_accessor :name
end

class Turtle
include Named
attr_accessor :age
end

shelley = Turtle::new
shelley.age = 100
shelley.name = "Shelley"

puts "My name is #{shelley.name}, I am #{shelley.age} years old. I am a #{shelley.class.name}."

My name is Shelley, I am 100 years old. I am a Turtle.


Moduł nie może mieć instancji, ale instancje mogą mieć klasy włączające moduł. Jak chodzi o różnicę pomiędzy modułami a wielokrotnym dziedziczeniem to w praktyce jest raczej niewielka. Podejście Ruby wydaje mi się jedkanowoż bardziej eleganckie.

Temat: Zalety i wady mixinów

A jak wyglądałby przykład zastąpienia wielodziedziczenia?, np. klasa która jednocześnie by dziedziczyła z innej klasy i włączała moduł albo włączała dwa moduły?
Weźmy przykład:

Obrazek

Jest to hipotetyczny struktura kontrolek, coś w stylu VCL Delphiowego, tylko że tam nie ma wielodziedziczenia:TComponent - komponent instalowany przez użytkownika, niekoniecznie wizualny, TControl - klasa podstawowa kontrolek wizualnych, TWinControl - kontrolka mająca uchwyt Windows, a pod nazwą TPaint jest klasa służąca do malowania, zamiast niej mógłby być mixin.Andrzej Borucki edytował(a) ten post dnia 22.12.12 o godzinie 19:37

Temat: Zalety i wady mixinów

Przykład z kontrolkami w Ruby na pastebin
Trochę dla mnie niejasne jest to że nie można dziedziczyć modułów, natomiast skompilowało się (ale czy się wykona?) odwołanie do pola Canvas, które zdefiniowane jest w innym module.
Czy można odwoływać się do dowolnego pola w klasie, do której zostanie włączony mixin a nie tylko do pól mixina?Andrzej Borucki edytował(a) ten post dnia 23.12.12 o godzinie 10:54

konto usunięte

Temat: Zalety i wady mixinów

Andrzej Borucki:
Czy można odwoływać się do dowolnego pola w klasie, do której zostanie włączony mixin a nie tylko do pól mixina?

module Named
attr_accessor :name

def introduce
"My name is #{name}, I am #{age} years old. I am a #{self.class.name}."
end
end

class Turtle
include Named
attr_accessor :age
end

shelley = Turtle::new
shelley.age = 100
shelley.name = "Shelley"

puts shelley.introduce

My name is Shelley, I am 100 years old. I am a Turtle.
Marcin W. edytował(a) ten post dnia 23.12.12 o godzinie 16:28

Temat: Zalety i wady mixinów

Jak będzie wyglądał przykład gdzie dodajemy mixin do dwóch rożnych klas. Czy są jakieś przykłady praktycznego wykorzystania mixinów; na razie widziałem definicję modułu w itemconfig.rb a użycie w menu.rb i text.rb (z c:\RailsInstaller\Ruby1.9.3\lib\ruby\1.9.1\tk\), ale nie widzę dokładnie tych pól, do kórych odwołuje się mixin.

konto usunięte

Temat: Zalety i wady mixinów

class Animal
include Comparable
attr_accessor :name, :age

def initialize(name, age)
self.name = name
self.age = age
end

def to_s
"#{name} the #{self.class.name}, aged #{age}"
end
end

class Turtle < Animal
# Dla zolwi liczy sie wiek
def <=>(other)
self.age <=> other.age
end
end

class Cat < Animal
# Dla kotow liczy sie imie
def <=>(other)
self.name <=> other.name
end
end

def main
turtles = [
Turtle::new("Adam", 101),
Turtle::new("Shelley", 100),
Turtle::new("Magellan", 102),
]

cats = [
Cat::new("Grizabella", 1),
Cat::new("Amelie", 7),
Cat::new("Marcus Aurelius", 0.5),
]

puts "Sorted turtles:"
puts turtles.sort!
puts "Sorted cats:"
puts cats.sort!
end

if __FILE__ == $0
main
end



Wyślij zaproszenie do