1. ホーム
  2. objective-c

[解決済み] Objective-Cで抽象クラスを作成する

2022-03-18 17:17:25

質問

私はもともとJavaのプログラマーで、今はObjective-Cを使って仕事をしています。抽象クラスを作りたいのですが、Objective-Cではそれができないようです。これは可能なのでしょうか?

そうでない場合、Objective-Cではどの程度抽象クラスに近づけることができるのでしょうか?

どのように解決するのか?

通常、Objective-Cのクラスは慣習によってのみ抽象化されています。もし作者がクラスを抽象化すると文書化した場合、サブクラス化せずに使用すればよいのです。しかし、抽象クラスのインスタンス化を阻止するコンパイル時の強制力はありません。実際、ユーザが抽象メソッドの実装をカテゴリ経由で(つまり実行時に)提供することを止めるものは何もないのです。少なくとも、抽象クラスのメソッド実装で例外を発生させれば、特定のメソッドをオーバーライドすることを強制できます。

[NSException raise:NSInternalInconsistencyException 
            format:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)];

メソッドが値を返す場合は、もう少し簡単に

@throw [NSException exceptionWithName:NSInternalInconsistencyException
                               reason:[NSString stringWithFormat:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)]
                             userInfo:nil];

を使用すると、メソッドから return 文を追加する必要がなくなります。

抽象クラスが本当にインターフェースである場合(つまり、具象メソッドの実装がない場合)、Objective-Cのプロトコルを使用するのがより適切な選択肢です。