2009-02-18 24 views
6

Wszystkie obiekty w actionscript3.0 dziedziczą po klasie Object, ale kompilator actionscript3.0 nie jest wystarczająco inteligentny, aby to zrozumieć.Dlaczego upośledzenie klasy actionscript3.0 kończy się niepowodzeniem (czasami)?

spojrzeć na poniższy kod:

package{ 
    public class TestOne{ 
     public function TestOne(){ 
     var t2: TestTwo = new TestTwo(); 
     trace(t2.toString()); // COMPILE TIME ERROR 
     trace((t2 as Object).toString(); // [object TestTwo] 

     var t22 : * = new TestTwo(); 
     trace(t22.toString()); // [object TestTwo] 
     trace((t22 as Object).toString(); // [object TestTwo] 
     } 
    } 
} 
class TestTwo{} 

t2.toString() daje błąd kompilacji czas, ponieważ typ danych t2 nie obejmuje toString(). Jednak t2 zawiera toString(), ponieważ jest to obiekt jako (t2 jako obiekt) .toString() pokazuje. Jeśli nie podamy zmiennej typu danych, np. T22, problem nie zostanie nigdy napotkany. Dlaczego nie można cofnąć kompilatora actionscript3.0, że t2 to zarówno TestTwo, jak i Object?

+0

Czy chodziło Ci o linie 9 i 10, aby wyśledzić zmienną "t22" zamiast "t2"? – aaaidan

+0

W twoim przykładzie jest kilka literówek, ale pytanie jest naprawdę interesujące ... –

Odpowiedz

4

To dlatego

Metody klasy Object są tworzone dynamicznie na prototypu Object. Aby przedefiniować tę metodę w podklasie obiektu, nie należy używać słowa kluczowania zastępczego . Na przykład podklasa obiektu implementuje funkcję toString(): String zamiast użycia override klasy bazowej.

Jeśli więc rzucisz TestTwo w obiekt, kompilator wie, że te metody zostaną zaimplementowane. Jeśli go nie rzucisz, TestTwo nie dziedziczy tych metod, więc nie zostały one zaimplementowane i spowoduje błąd.

To trochę dziwne!

+0

Dokładnie, jest następstwem dziedziczenia do litery, a toString nie jest klasową metodą dziedziczenia, jest na obiekcie prototypowym. AS3 bardzo ściśle przestrzega dziedziczenia klas, więc jeśli znajdziesz sytuację, w której myślisz, że tak nie jest, istnieje ryzyko, że czegoś brakuje, a nie kompilator! –

0

klasy dziedziczenie i prototyp dziedziczenie są dwie różne rzeczy w AS3. Dziedziczenie prototypowe jest, o ile rozumiem, uwzględnione wstecznej kompatybilności z AS2/AS1 i to prototypowe dziedziczenie, które zapewnia metodę dla zmiennej, która jest rzutowana na klasę Object w twoim przykładzie. Obiekt prototypowy ma metodę toString(), a nie obiekt . Ponieważ prototyp nie występuje w Twojej klasie TestTwo, nie ma on metody toString(). Jeśli metoda toString() została dostarczona za pośrednictwem dziedziczenia klas, Twój przykład zostanie skompilowany.

Z technicznego punktu widzenia, twoje stwierdzenie "Wszystkie obiekty w actionscript3.0 dziedziczą po klasie Object" nie jest całkowicie poprawne, z powodu różnicy między dziedziczeniem prototypów i dziedziczeniem klas. Dziedziczenie prototypowe to nieco ezoteryczna koncepcja OO, którą można znaleźć w językach skryptowych.

Czy ktoś wie, dlaczego AS3 został zaprojektowany w ten sposób?

Powiązane problemy