// 抽象クラス
class Support {
	private var name:String;
	private var next:Support;
	function Support(name:String) {
		this.name = name;
	}
	function setNext(next:Support):Support {
		this.next = next;
		return next;
	}
	// オーバーライド禁止
	function support(trouble:Trouble):Void { // コンストラクタと同じ名前なので警告がでます
		if (resolve(trouble)) {
			done(trouble);
		} else if (next != null) {
			next.support(trouble);
		} else {
			fail(trouble);
		}
	}
	function toString():String {
		return "[" + name + "]";
	}
	
	// 抽象メソッド
	private function resolve(trouble:Trouble):Boolean {return;}
	
	private function done(trouble:Trouble):Void {
		trace(trouble + "は" + this + "によって解決されました。");
	}
	private function fail(trouble:Trouble):Void {
		trace(trouble + "は解決できません。");
	}
}
