Strona wykorzystuje ciasteczka by usprawnić komfort z jej korzystania. Korzystając ze strony akceptujesz naszą Politykę Ciasteczek. X

Tworzenie podklasy z przygotowaną grafiką [podstawowy]

Jakiś czas temu opisałem jak wykorzystać Interface'y do utworzenia systemu popup'ów - dokładnie tutaj. Wspomniałem wtedy, że w podobnym celu również można utworzyć klasę nadrzędną, jednak w tym wypadku we Flash'u może okazać się to trudniejsze niż można byłoby się tego spodziewać, albo przynajmniej przysporzyć nieoczekiwanych kłopotów. By zrozumieć czym dokładnie są te kłopoty najlepiej będzie zacząć od końca, czyli od wytłumaczenie jak je obejść - sposoby są dwa:

1. Jedna klasa nadrzędna obsługuje wszystkie klasy podrzędne.
Powiedzmy, że mamy dwa popup'y, jeden z tekstem a drugi z obrazkiem, ale oba mają dwa wspólne elementy: tło oraz przycisk "OK". W tym momencie logiczne byłoby utworzenie w sumie trzech klas: MyPopup który będzie klasą nadrzędną opisującą działanie tła (nazwanym np. "mcBackground") wraz z przyciskiem ("mcButton"), oraz MyPopupImage odpowiedzialny za popup z obrazkiem i MyPopupText odpowiedzialny za popup z tekstem. Niestety, Flash odmówi skompilowania takiego projektu tłumacząc, że wystąpił konflikt między tłem w klasie MyPopup a tłem w klasach nadrzędnych MyPopupImage i MyPopupText. Oczywiście można by było stosować różne nazwy, ale to mija się z pierwotnym celem - właściwym rozwiązaniem jest … usunięcie klas nadrzędnych, a dokładnie ich plików, pozwalając by Flash utworzył je sam.

Szczerze mówiąc nie mam pojęcia jak to działa, ale jedno jest pewno, od teraz będziemy mogli tworzyć popup'y wykorzystując nazwy z klasy nadrzędnej bez żadnych problemów, oczywiście po za faktem, że teraz będziemy musieli tworzyć logikę wszystkich popup'ów w jednym miejscu.

2. Wykorzystując funkcję GET.
Tutaj sytuacja jest dokładnie odwrotna, wszystkie klasy nadrzędne będziemy musieli stworzyć sami, nawet jeśli będzie to plik zawierający zero wykonywanego kodu.
Wracając do przykładu z 3 klasami: MyPopup, MyPopupImage i MyPopupText - przygotujemy je tak, by żadne zmienne nie konfliktowały ze zmiennymi w klasie nadrzędnej:

//MyPopup class
public class Popup extends MovieClip {
	public function Popup() {
	}
}
//MyPopupImage
public class MyPopupImage extends MyPopup {
	public var mcBackground:MovieClip;
	public var mcButton:MovieClip;
		
	public function MyPopupImage() {	
	}
}
//MyPopupText
public class MyPopupText extends MyPopup {
	public var mcBackground:MovieClip;
	public var mcButton:MovieClip;
		
	public function MyPopupText() {	
	}
}
No dobra, ale czy to się nie mija z celem? W końcu klasa nadrzędna nie będzie mieć dostępu do "mcBackground" i "mcButton", a więc tak czy siak potrzebne będzie napisanie ich logiki dwa razy (dla każdego z popup'ów). Tutaj właśnie do akcji wchodzą funkcję GET, które dodamy do MyPopup w następujący sposób:
public class MyPopup extends MovieClip {
	public function MyPopup() {
	}
	protected function get popupBackground():MovieClip {
		return null;
	}
	protected function get popupButton():MovieClip {
		return null;
	}
}
A z kolei MyPopupImage i MyPopupText przebudujemy tak:
//MyPopupImage
public class MyPopupImage extends MyPopup {
	public var mcBackground:MovieClip;
	public var mcButton:MyButton;
	
	public function MyPopupImage() {	
	}
	
	override protected function get popupBackground():MovieClip {
		return mcBackground;
	}
	override protected function get popupButton():MovieClip {
		return mcButton;
	}
}
//MyPopupText
public class MyPopupText extends MyPopup {
	public var mcBackground:MovieClip;
	public var mcButton:MyButton;
	
	public function MyPopupText() {	
	}
	
	override protected function get popupBackground():MovieClip {
		return mcBackground;
	}
	override protected function get popupButton():MovieClip {
		return mcButton;
	}
}
I gotowe, teraz klasa nadrzędna MyPopup ma dostęp do tła i przycisku z klas nadrzędnej:
public function MyPopup() {
	super();
	trace(popupBackground!=null); //true
}

Przetestuj samemu: subclass.zip


Imię:
Komentarz:
Potwierdz kod z obrazka:confirm image