2

私はUITableViewControllerサブクラス(「MyTableViewClass」と呼びます。これは最終的に特定のテーブルビューコントローラー(「MySpecificTableViewClass」と呼びます)にサブクラス化されます。理想的には、MySpecificTableViewClassにあるいくつかのメソッドを作成する必要があります。 「必須」、つまり開発者インターフェースに「実装が完了していません」と表示させる方法はありますか?MyTableViewClassのプロトコルで宣言する必要はありませんか?

MyTableViewClass.h

#import <UIKit/UIKit.h>

@class MyTableViewClass;
@protocol MyTableViewClassProtocol <NSObject>;

-(void) fooBar;
@end

@interface MyTableViewClass : UITableViewController <NSFetchedResultsControllerDelegate, MyTableViewClassProtocol>
....

これは、MyTableViewClassの実装で、fooBarの実装を「忘れた」ことを示します。私はそれをスタブメソッドで処理できると思います(それが最善の方法ですか?)。

MySpecificTableViewClass.h

....
#import "MyTableViewClass.h"

@interface MySpecificTableViewClass : MyTableViewClass
....

MySpecificTableViewClassの実装では-私が行方不明であることを示す警告はありません

-(void) fooBar

MySpecificTableViewClass.hをに変更した場合

....
#import "MyTableViewClass.h"

@interface MySpecificTableViewClass : MyTableViewClass <MyTableViewClassProtocol>
....

次に、警告が表示されますが、プロトコルを定義することを覚えているか、直感に反しているように見えますか、それとも完全に何かが欠けていますか?

4

2 に答える 2

2

NSAssert()スタブを挿入し、それらを呼び出して(実行時に)実装されていないメソッドをキャッチする以外に、これを実装するための優れた方法を見つけられませんでした。Objective-Cには抽象クラスの概念がありません。

そうは言っても、私はこのパターンを自分で使用しましたが、多くの場合、設計を再考し、戦略パターンとプロトコルを使用する方がよいでしょう。つまり、抽象を使用する代わりに、のサブクラスであり、必要な特別なロジックを含むMyTableViewClassを作成します。次に、テーブルビューコントローラをの直接のサブクラスおよびのデリゲートにすることができます。代理人として、プロトコルを実施できます。そして、これにより、よりシンプルで柔軟なオブジェクトモデルが作成されます。それは常に適切であるとは限らず、抽象クラスがその場所を持っていますが、純粋な継承にジャンプする前に、戦略パターンを検討してください。多くの場合、より適切に機能します。MyTableViewHandlerNSObjectUITableViewControllerMyTableViewHandler

于 2013-02-28T17:33:45.323 に答える
0

MyTableViewClassはすでにプロトコルを実装しているため、そのサブクラスはそれらの実装を利用できるようにします。つまり、サブクラスも一種の実装です。サブクラスの実装を変更/拡張できます。

于 2013-02-28T17:20:58.213 に答える