私は潜在的に不可能な欲求を持っています。私はいくつかのサブクラスを構築したいクラスを持っています。各サブクラスは同じインターフェイスを実装しますが、BASE クラスがそのインターフェイスのメソッドを呼び出すようにしたいと考えています。
これが私が欲しいもののコンパイラエラーyバージョンです:
public class Class1
{
public function Class1()
{
initialize();
}
}
public interface Int
{
function initialize():void;
}
public class Class2 extends Class1 implements Int
{
public function Class2()
{
super();
}
public function initialize():void
{
// Code unique to the class goes here.
}
}
Class1 のインスタンスを作成するつもりはありませんが、明らかにこのコードは壊れています。この単純化されたバージョンでも馬鹿げているように見えますが、これが必要な理由を示しています。各クラスinitialize()
でコンストラクターを自動的に呼び出す必要があるため、スーパークラスに保持することは理にかなっています。
今、私は次のようなことができます:
public class Class1
{
public function Class1() implements Int
{
initialize();
}
public function initialize():void {}
}
public interface Int
{
function initialize():void;
}
public class Class2 extends Class1 implements Int
{
public function Class2()
{
super();
}
public override function initialize():void
{
// Code unique to the class goes here.
}
}
これは私が今いるところのようなものですが、メソッドをスーパークラスに配置してサブクラスでオーバーライドすると、インターフェイスを持つ目的が無効になります。メソッドの要件は、initialize()
元のクラスを拡張するだけで満たされ、各サブクラスにそのメソッドをオーバーライドするように強制できることを知る方法はありません。もちろん、基本クラスの呼び出しを省略して、それを各サブクラスに挿入することもできますが、その要件を強制することもできません。
だから私の質問は、#1のバージョン(インターフェイスを実装しない基本クラスでインターフェイスメソッドを呼び出す)が壊れないか、または#2のバージョン(問題のメソッドをオーバーライドする)がREQUIREになるかです。サブクラスによってオーバーライドされる initialize() ?