package { public interface ILanguage { function showLangName():void; function getName():String; } }
package { public class English implements ILanguage { public function showLangName():void { trace(getName()); } public function getName():String { return "English"; } } }
package { public class Chinese implements ILanguage { public function showLangName():void { trace(getName()); } public function getName():String { return "Chinese"; } } }
package { public class French implements ILanguage { public function showLangName():void { trace(getName()); } public function getName():String { return "French"; } } }
package { public interface IPerson { function addLanguage(lang:ILanguage):void; function showLangs():void; function getName():String; } }
package { public class Person implements IPerson { protected var langObj:Object; public function Person(p:Person) { if (p!=this) { throw new Error("不能实例化抽象类!");
} langObj={}; } public function addLanguage(lang:ILanguage):void { var langName:String=lang.getName(); ! langObj[langName] && (langObj[langName]=lang); } public function showLangs():void { trace(getName()+" can speak:"); for each (var j:* in langObj) { ILanguage(j).showLangName(); } } public function getName():String { return null; } } }
package { public class Andy extends Person { public function Andy() { super(this) addLanguage(new English); addLanguage(new French); addLanguage(new Chinese); } override public function getName():String { return "Andy"; } } }
package { public class Leon extends Person { public function Leon() { super(this) addLanguage(new English); addLanguage(new Chinese); } override public function getName():String { return "Leon"; } } }
package { import flash.display.Sprite; public class Test extends Sprite { public function Test() { var p:IPerson=new Andy; p.showLangs(); p=new Leon(); p.showLangs(); } } }