16

とにかくObjective-Cカテゴリの概念はミックスインの概念に似ていますか?もしそうなら:類似点は何ですか?そうではありません:違いは何ですか?

4

4 に答える 4

17

私の理解の限りでは:

Mixins

  • 構成のためのシンタックスシュガー
  • ユーザーではなく、クラスの開発者によって追加されました
  • 複数のクラスで再利用できます
  • インスタンス変数を追加できます
  • Objective-Cで転送を使用して実装できます

カテゴリ

  • 他の言語の拡張メソッドと同様
  • 通常、開発者ではなく、クラスのユーザーによって追加されます
  • ちょうど1つのクラスとそのサブクラスによって使用されます
  • インスタンス変数を追加できません
于 2009-08-07T15:59:54.547 に答える
7

明確にするために、答えはノーです-それらは同じではありません。

違いは、受け入れられた回答でJohn Calsbeekによって概説されていますが、重要な違いは、ミックスインを異なるクラスで使用できることですが、カテゴリは常に1つのクラスを拡張します-定義で宣言します。

これは、これら2つの機能のユースケースがまったく異なることを意味するため、重要な違いです。別の見方をすれば、RubyからObjective-Cに移行していて、ミックスインが欠落している場合、カテゴリに喜びを感じることはありません。

ミックスインのユースケースは、共通のスーパークラスを持たないいくつかのクラスで再利用したいコード(メソッドとインスタンス変数)があることです。カテゴリではそれを行うことはできません。

ミックスインは、Objective-Cにはないタイプの事実上「多重継承」です。最も近いものはJavaがインターフェースであるのと同じように、objective-cで最も近いものはプロトコルですが、インスタンス変数もメソッド本体もありません(Objective-CまたはJavaの場合)。したがって、通常、ヘルパークラスを作成したり、スーパークラスにコードを配置したりする必要があります。

Objective-cカテゴリのユースケースは、既存のクラス(システムクラスやライブラリクラスであっても)にメソッドを追加することです。

ミックスインの方が強力だと思いますが、リンゴとオレンジの比較なので意味がありません。

正確に言うと:

  • RubyでCategoriesに相当するものは、拡張するクラスを再度開いて拡張することです。(これはRubyのどこでも実行でき、実質的にカテゴリと同じです)

  • Mixinsに相当するObjective-cが何であるかはわかりませんが、誰か?

[更新]もう少し検索します。Objective-CにはMixinに相当するものはありませんが、進取の気性に富んだVladimir Mitrovicは、それを効果的に実行するライブラリを作成しました。https://github.com/vl4dimir/ObjectiveMixin

私はそれを使用するかどうかについて2つの考えを持っています:使用している言語が何かをサポートしていない場合、それと戦ったり、他の言語からお気に入りの機能をインポートしようとするよりも、それを使用する方が簡単な場合があります。(「好きなプログラミング言語を使うことができない場合は、一緒にいる言語を愛してください」)。

繰り返しになりますが、おそらくそれは私のスヌーピーに少しだけです。アスペクト指向プログラミングの動き全体は、何年にもわたってJavaに機能をもたらしてきました(しかし、JBossの外では、あまり注目を集めることはありませんでした)。とにかく、ウラジミールは彼の例でニンジャタートルズを使用することで追加の称賛を得ています。

別のサイドノード:相対的なObjective-c noobとして、Web全体で見つけたサンプルコードではカテゴリが多用されているように見えます。静的ヘルパーメソッドをカテゴリ付きのシステムクラスに追加するのが一般的な方法のようです。プロジェクトにこれらのメソッドを格納するヘルパークラスを作成するのと同じくらい簡単で、システムクラスが更新されたりインポートしたりするときにメソッドが壊れるリスクが少なくなります。独自のそのようなカテゴリを持つ他の誰かのライブラリ。一般的な例は、UIColorに新しい静的カラーメソッドを追加することです。それらをローカルクラスに追加してみませんか?

私がカテゴリで見た本当に良い使用法の1つは、システムクラスではなく、生成されたクラスにメソッドを追加することです。したがって、コアデータオブジェクトモデルからクラスを生成し、実際にモデルクラスに属する新しいコンストラクターやその他のメソッドを追加する場合は、カテゴリを使用してそれを行うことができます。これにより、変更した場合にモデルクラスを安全に再生成できます。あなたの仕事を失うことなく、あなたのモデル。

要約:-ミックスインのソリューションとしてのカテゴリを忘れる-カテゴリはコアデータには適していますが、それ以外の場合は過剰に使用され、過大評価されています

于 2012-10-19T09:30:43.587 に答える
4

カテゴリは特定のクラスに対して定義されています。私が知る限り、カテゴリを作成して、それが実装するメソッドを複数のクラスに追加することはできません。

于 2009-08-07T13:44:52.207 に答える
2

ミックスインを使用すると、ベースとミックスインから新しいクラスを派生させ、この新しいクラスをインスタンス化してそれを利用できます。

カテゴリを使用すると、基本クラスを効果的に直接追加できるため、その基本のすべてのインスタンスがカテゴリによって提供される機能にアクセスできます。

于 2009-08-07T13:50:10.327 に答える