0

プロトコルの必要性は、階層的に関連していないクラスのメソッドを抽象化することです。

同様のことは、これらすべてのメソッドを包含し、それらをサブクラス化するクラス(インターフェース)の助けを借りて行うこともできますか?(クラスはNSObjectから既に派生している必要があるため、多重継承の問題のため、これは実際には不可能です。NSProxyの場合は無視してください)

プロトコルがクラスよりもできる特別なことは何ですか?

プロトコルは多重継承問題のみを解決しようとしていますか?

4

3 に答える 3

4

プロトコルの主な利点は、サブクラス化を強制せずに、オブジェクトが実行できる必要があることを記述していることです。多重継承を持たない言語では、他のプログラマーがクラスを使用できるようにする場合は、このようなメカニズムが必要です。(委任を参照)

たとえば、Javaには、インターフェースと呼ばれる同様の機能があります。

これは、他の開発者が明確に定義されたプロトコルを介してクラスを拡張できるようにするため、動的システムの構築が非常に簡単であるため、大きな利点を意味します。

実用的な例:
私はREST APIを設計しているだけで、Objective-Cクライアントライブラリを提供しています。
私のAPIはユーザーに関する情報を必要とするため、プロトコルを追加します

@protocol VSAPIClientUser <NSObject>
-(NSString *)lastName;
-(NSString *)firstName;
-(NSString *)uuid;
@end

このユーザー情報が必要な場所には、このプロトコルに準拠する必要のある基本的なidオブジェクトがあります。

-(void)addUserWithAttributes:(id<VSAPIClientUser>)user;

この行は次のように読むことができます:「私は気にしない、あなたがここでどんな種類のオブジェクトを提供するか、それが知っている限りlastNamefirstNameそしてuuid」。そのため、そのオブジェクトの残りの部分がどのように見えるかはわかりません—そして私は気にしません。

ライブラリの作者として、私はこれを安全に使用できます。

 NSDictionary *userAttributes = @{@"last_name" : [user lastName],
                                  @"first_name": [user firstName],
                                        @"uuid": [user uuid]};

ところで:私は多重継承の欠如を問題とは呼びません。別のデザインです。

「[…]今日その決定を再検討した場合、単一の継承も削除することさえできるかもしれません。継承はそれほど重要ではありません。カプセル化はOOPの永続的な貢献です。」— Brad Coxに、Objective-Cに多重継承がない理由を尋ねました。(プログラミングの首謀者:主要なプログラミング言語の作成者との会話、p。259)

于 2012-10-15T15:47:54.753 に答える
1

別の見方として...

オブジェクト指向プログラミングの最も基本的な価値は、現実世界の関係を抽象的で漠然と同等のコンピューター世界の構造に変換するのではなく、直接モデル化できることです。言語が、問題を説明するために使用できる用語とは異なる用語でソリューションの実装について考える必要がある場合は常に、OOPツールとして欠陥があります。(私は「役に立たない」とは言わなかったことに注意してください。:))

実世界のオブジェクトには、コンテキストに応じてさまざまな役割があります。それらの役割は状態を持つことができます。したがって、多重継承の欠如がモデリングの容易さの障害であることに同意します。Objective-Cプロトコル、Javaインターフェース、および継承よりも合成を優先する必要があるという主張はすべて、OOPの利点の基本的な部分を否定しています。

于 2012-10-15T16:06:44.300 に答える
0

C ++抽象クラスの多くの用途の1つは、他の用途の中でも、インターフェースを定義することです(再利用可能なコントラクトを指定するため)。ただし、Objective Cなど、この意味でインターフェイスの概念が異なる他のプログラミング言語もあります。Objective Cでは、プロトコルと呼ばれます。

このような構成を広く使用するには、オブジェクトに複数のコントラクトをアタッチする方法が必要です。そして、そのようなインターフェースが相互に継承することを許可されている場合、これは有用であるために多重継承でなければなりません。

ただし、これはクラス間の多重継承と同じではありません。

プロトコルは多重継承問題を解決しようとはしていません。彼らは、コントラクト仕様をオブジェクト(データ+コード)仕様から分離しようとしています。それらは実際にはクラスよりもはるかに少ないことができ(多重継承の側面を無視した場合)、それがそれらが別個の概念として存在する理由です。

プロトコルの実装は、一般に、クラスから継承するよりもはるかに制限の少ない(より安全な)提案です。

于 2012-10-15T15:56:49.967 に答える