16

co-私は、標準ライブラリ (例: collectionsとcontravariancetrait Function)の使用について知っており、「現実世界」のビジネス アプリケーションの設計にどのように使用されているのco-か疑問に思っています。contravariance

4

2 に答える 2

24

古典的な例は関数で、引数が 1 つの関数に Scala インターフェースを使用します。

trait Function1[-T1, +R]

どちらが-引数の反変 ( +) であり、戻り値の型の共変 ( ) です。

なんで?

次のクラスがあるとします。

class Timelord { ... }
class Doctor extends Timelord { ... }

class Enemy { ... }
class Dalek extends Enemy { ... }

Doctor => Enemyパラメータとして関数を取るメソッドがある場合。のインスタンスを提供しても問題ありませんTimeLord => Enemy。のインスタンスは引き続き受け入れますDoctor

SoTimeLord => Enemyは のサブクラスDoctor => Enemyので、TimeLordは のスーパークラスでありDoctor、そのパラメータで反変です。

同様に、 a を返す関数は、 aが is-anであるため、Daleksome を返す関数が必要な場合に有効です。EnemyDalekEnemy

SoDoctor => Dalekは のサブクラスであるDoctor => Enemyため、Dalekは のサブクラスでありEnemy、そのパラメータで共変です。

于 2011-03-11T23:53:00.937 に答える
9

基本的に、パラメトリック ポリモーフィズム (ジェネリック)と継承の両方を利用したい場合は、宣言サイト バリアンス ( +/ -)サイト バリアンス (ワイルドカード)の使用、またはその両方が必要になる可能性があります。

通常、ポリモーフィック型はかなり高レベルの抽象化であるため、ドメイン オブジェクトにバリアンス アノテーションは必要ないかもしれませんが、少なくともドメイン オブジェクトが継承の一部である場合は、ドメイン オブジェクトを操作するために記述するコードでバリアンス アノテーションを使用する必要がある可能性があります。非常に頻繁に見られる階層。

基本的にすべてのライブラリまたはフレームワークを見ると、バリアンス アノテーションが頻繁に使用されていることがわかります。「実世界」のアプリケーションを正しく抽象化している場合、おそらくそれをサポートするために多くのライブラリを作成し、重要なビジネス ロジックの小さなコアをすべてのサポート インフラストラクチャから適切に分離することになります。インフラストラクチャをサポートするすべてのものは、おそらく分散アノテーションも頻繁に使用するでしょう。

于 2011-03-11T23:17:54.210 に答える