0

重複の可能性:
Objective-C での @Protocols の理解
Objective C プロトコルの使用法

私はObjective Cの学習を始めたばかりで、プロトコルをうまく理解していないようです。Objective-C のプロトコルについての私の理解では、実際にコードを記述せずにメソッド定義を指定します。つまり、私のクラスを継承することを決定した人は、必要なすべてのメソッドを実装する必要があります。

ここでの私の質問は、実際には必要のない余分なオーバーヘッドを作成するプロトコルではないということです。新しいクラスにメソッドが必要な場合は、それを実装するだけです。プロトコルから継承する必要があるのはなぜですか?

プロトコルの使用を無視して、必要に応じてメソッドを作成することができないのはなぜですか。

4

2 に答える 2

1

とりわけ、プロトコルは、一般的なエラーを回避するためにコンパイラーを支援する方法です。この場合、あるクラスが別のクラス (多くの場合デリゲート) の特定のメソッドを呼び出すように指定できます。コンパイラは、他のクラス (デリゲート) が実際にそれらのメソッドを実装していることを確認し、そうでない場合は警告メッセージを表示します。未定義のセレクター (メソッド) が原因で実行時にクラッシュするよりも、コンパイル時にメッセージを取得する方が望ましいです。

于 2012-07-18T04:03:59.510 に答える
0

ここでの私の質問は、実際には必要のない余分なオーバーヘッドを作成するプロトコルではないということです。

追加のオーバーヘッドはありません。

新しいクラスにメソッドが必要な場合は、それを実装するだけです。プロトコルから継承する必要があるのはなぜですか?

まあ、それがあなたのニーズにとって理想的な方法であれば、共通の実装のサブクラスを確実に宣言できます。これを試すと、以下に概説する問題に遭遇する可能性があります。

プロトコルは実際の物理タイプではないため、よく使用されます。メソッドやその他のプロトコルのインターフェースです。通常、それらは小さくて専門的です。objc は複数の継承を提供しないため、短い拡張にはプロトコルが非常に便利です。

複雑なサブクラスであり、1 つ以上のプロトコルを継承するタイプを見てください。NSString <NSCoding, NSCopying, NSMutableCopying, NSObject>例として取り上げます。objc が単一継承を使用することを知っている場合は、このクラスを実装し、それらすべてのプロトコルから「継承」する方法を検討してください。次に、すべての Foundation 型に対してこれを実装した後に、これらの型を渡すときにクライアントに与える影響を検討してください。クラス階層とインターフェイスは非常に乱雑になります。多くのクラスのバリエーションの数は、これらすべてのタイプをパラメーターとして収容するために爆発的に増加します。ほとんどの人はその時点より前に停止し、型の安全性を落とすだけです。これも非常に悪い考えです。プロトコルを使用すると、「このインターフェイスを実装」し、単純な言語機能でタイプ セーフをすべて実現できます (多重継承はすぐに見苦しくなります)。

于 2012-07-18T05:13:51.887 に答える