3

このインターフェイスの意味は何ですか? クラスにインターフェースを実装したとしても、別のクラスに実装するたびにその機能を何度も宣言する必要があるため、as3またはインターフェースを持つ他の言語にインターフェースが存在する理由は何ですか。ありがとうございました

4

5 に答える 5

3

これまでに投稿された回答に基本的に同意しますが、少し追加する必要がありました。

最初に簡単な部分に答えると、はい、他の言語にはインターフェースがあります。Java がすぐに思い浮かびますが、すべての OOP 言語 (C++、C# など) には、インターフェイスを作成するための何らかのメカニズムが含まれていると確信しています。

ジェイクが述べたように、作業を分離するために、満たされるものの「契約」としてインターフェースを書くことができます。仮に、私が A に取り組んでいて、あなたが C に取り組んでいて、ボブが B に取り組んでいるとします。B' を B のインターフェイスとして定義すると、B' を迅速かつ比較的簡単に定義できます ( B、実装)、そしてすべてが順調に進んでいます。AI から B' へのコーディングが可能で、C から B' へのコーディングが可能であり、ボブが B を使い終わったらプラグインするだけでよいと想定できます。

これが Jugg1es の要点です。機能部分全体を交換する機能は、「依存性注入」によって簡単になります (このフレーズがわからない場合は、Google で検索してください)。これは正確に説明されていることです。たとえば、データベース コネクタなど、何かが何をするかを一般的に定義するインターフェイスを作成します。すべてのデータベース コネクタに対して、データベースに接続してクエリを実行できるようにする必要があるため、クラスに "connect()" メソッドと "doQuery(stringQuery)" が必要であるというインターフェイスを定義できます。ここで、Bob が MySQL データベースの実装を作成したとします。クライアントは、新しいサーバーに 200,000 ドルを支払ったばかりで、Microsoft SQL を実行するので、ソフトウェアでそれを利用するには、データベース コネクタ。

実生活では、シカゴで食肉の包装/流通会社を経営している友人がいます。パッケージをスキャンし、出入りする際に重量を量る (在庫) ためのソフトウェア/ハードウェアのセットアップを行う会社は、ソフトウェアを維持するために、新しい OS/サーバーと新しいハードウェアにアップグレードする必要があると言っています。ソフトウェアは、下位互換性を維持できるようにモジュール方式で作成されていません。私は何度もこのボートに乗っていて、私の仕事を90%簡単にするabc機能を得るためにxyzをアップグレードする必要があると誰かに言いました。とにかく、現実の世界にいると、人々は常にこれらのものを利用するとは限らず、お尻に噛み付く可能性があります.

于 2013-03-26T20:42:12.760 に答える
2

インターフェイスは、特に大規模なアプリケーションを開発する場合に、OOP にとって不可欠です。1 つの例は、ユーザーに関するデータを返すデータ レイヤーが必要な場合です。最終的にデータの取得方法を変更した場合、たとえば、XML Web サービス データから始めて、フラット ファイルなどに切り替えたとします。データ レイヤーのインターフェイスを作成した場合は、それを実装する別のクラスを作成し、アプリケーション レイヤーのコードを変更することなく、データ レイヤーにすべての変更を加えることができます。Flex を使用しているのか Flash を使用しているのかわかりませんが、Flex を使用する場合、インターフェイスは非常に便利です。

于 2013-03-26T19:44:34.317 に答える
2

インターフェイスは、クラスの機能を定義する方法です。一人で作業している場合 (特に最初は) あまり意味がないかもしれませんが、チームで作業を開始すると、コードがどのように機能するか、作成したクラスを使用する方法を人々が理解するのに役立ちます (コードをカプセル化したままにします)。 )。私の意見では、それが中級レベルでそれらを考える最良の方法です.

于 2013-03-26T19:49:47.613 に答える
2

既存の回答は非常に優れていますが、ActionScript でインターフェイスを使用する主な利点が欠けていると思います。つまり、そのインターフェイスの実装をメイン ドキュメント クラスにコンパイルする必要がなくなるということです。

たとえば、インターフェイスがある場合、ISpaceShipそのインターフェイスに型指定された変数を設定するためにいくつかのことを行う選択肢があります。メイン ドキュメント クラスが ISpaceShip を実装する外部 swf をロードできます。Loader のcontentLoaderInfoCOMPLETE イベントが発生すると、contentを ISpaceShip にキャストし、その実装 (それが何であれ) が読み込み中の swf にコンパイルされることはありません。これにより、読み込みプロセスが発生している間、実際のコンテンツをユーザーの前に置くことができます。

同様に、タイプ ISpaceShip の親 AS クラスでタイムライン インスタンスを宣言し、「フレーム N での Actionscript のエクスポート *un*」をオンにすることもできます。これは、最初に使用されたフレームでコンパイルされるため、不要になります。プリロード時間でこれを考慮に入れる.十分なものでこれを行うと、突然、プリローダーさえ必要なくなります.

インターフェイスへのコーディングのもう 1 つの利点は、コードで単体テストを実行する場合です。これにより、共同作業者のメリットや共同作業者がテストに適していない場合ではなく、コード自体のメリットによってコードが成功または失敗していることを確認できます。たとえば、特定の種類のビューを制御するように設計されたコントローラーがある場合、テスト用に完全なビューをインスタンス化するのではなく、テストに違いをもたらす機能のみをインスタンス化する必要があります。

職場でテストを書くためのサポートが得られない場合は、インターフェイスにコーディングすることで、テストを記述できるようになった時点でコードをテスト可能にすることができます。

于 2013-03-26T21:31:34.213 に答える
1

上記の回答はすべて非常に優れています。私が追加する唯一のことは、いくつかの型指定されていないコレクション クラス (配列、オブジェクト、辞書) とオブジェクト/動的クラスがある AS3 のような言語ではすぐに明確にならない可能性があることです。異なるオブジェクトをタイプ別にグループ化する手段であること。

簡単な例:

プレイヤーがさまざまなターゲットにロックオンするミサイルを持っているスペース シューターのイメージ。この目的のために、これを登録するための内部関数 (別名インターフェース) を持つためにロックできる任意のタイプのオブジェクトが必要であるとします。

function lockOn():void;//Tells the object something's locked onto it

function getLockData():Object;//Returns information, position, heat, whatever etc

これらのターゲットは、敵、友人、パワーアップ、健康など、まったく無関係な一連のクラスなど、何でもかまいません。

1 つの解決策は、これらのメソッドを含む基底クラスからすべてを継承させることですが、敵とヘルス ピックアップは共通の祖先を論理的に共有しません (そして、ニーズに対応するために奇妙な継承チェーンを作成していることに気付いた場合は、再考する必要があります)。あなたのデザイン!)、そしてあなたのミサイルには、ロックされているオブジェクトへの参照も必要です:

var myTarget:Enemy;//This isn't going to work for the Powerup class!

また

var myTarget:Powerup;//This isn't going to work for the Enemy class!

...しかし、すべてのロック可能なクラスが ILockable インターフェイスを実装している場合は、これを型参照として設定できます。

var myTarget:ILockable;//This can be set as Enemy, Powerup, any class which implements ILockable!

..そして、インターフェース自体として上記の機能を持っています。




これらは、Vector クラスを使用する場合にも便利です (名前は誤解を招く可能性があります。これは単なる型指定された配列です)。配列よりもはるかに高速に実行されますが、単一の型の要素しか許可されません。また、インターフェイスを型として指定することもできます。 :

var lockTargets:Vector.<Enemy> = new Vector.<Enemy>();//New array of lockable objects

lockTargets[0] = new HealthPickup();//Compiler won't like this!

でもこれは...

var lockTargets:Vector.<ILockable> = new Vector.<ILockable>();

lockTargets[0] = new HealthPickup();
lockTargets[1] = new Enemy();

提供されEnemyHealthPickup実装されILockable、うまく機能します!

于 2013-03-26T21:46:51.327 に答える