C#で次のことが可能かどうか、私はたださまよっています。
operation を義務付ける List のようなインターフェースがあるとしましょうreverse
。すなわち:
public interface ReversableList<T> {
// Return a copy of this list but reversed
ReversableList<T> Reverse();
// We still need to return the contained type sometimes
T Get(int index)
}
ただし、そのインターフェイスを実装すると、次のようになります。
public class ListImplementation<T> : ReversableList<T>
ReversableList<T> Reverse();
}
私はまだインターフェイスを使用することを余儀なくされていますReversableList
。したがって、ユーザーが my を直接インスタンス化したとしても、メソッドを呼び出すときListImplementation
に対処する必要があります。ReversableList
Reverse
var concreteList = new ListImplementation<String>();
ReversableList<T> reversed = concreteList.Reverse();
一方、私が念頭に置いていたReverse()
のは、ListImplementation
will be anotherのことでしたListImplementation
。
var concreteList = new ListImplementation<String>();
ListImplementation<String> reversed = concreteList.Reverse();
まだ十分に一般的なインターフェースを実装しています。
これが紛らわしい場合はお知らせください。必要な詳細や修正を明確化/追加します。ありがとうございました!
関心の源
以下は、これが私にとって興味深い理由の説明です。
(具体的な型である) scala のコレクションで呼び出さreversed
れた関数を、それが継承するすべてのインターフェイス (特性) を介して追跡しました。List
私が見つけたものは非常に興味深いものです。
元のメソッドは、 traitreverse
で抽象的に定義されています。GenSeqLike
trait GenSeqLike[+A, +Repr] ...
def reverse: Repr // <--- NO BODY, means abstract
次に、 traitを拡張するtrait SeqLikeで具体的に定義します。GenSeqLike
trait SeqLike[+A, +Repr] extends GenSeqLike[A, Repr]
def reverse: Repr
//iterates through this seqence
// and reverses
for (x <- this)
//...etc
次に興味深いのは、次の 2 つの特性です。
trait Seq[+A] extends SeqLike[A, Seq[A]] //<-- NOTE here is the type for "Repr"
//no mention of reverse
trait LinearSeq[+A] extends Seq[A] with SeqLike[A, Seq[A]] //<-- NOTE type again
// no mention of reverse
どちらも関数の「無料」バージョンを取得しreverse
ますが、どちらもそれぞれの「インターフェース」(特性) に関して機能します。reverse
を返しSeq
ますSeq
。
最後に、List
具象クラスがLinearSeq
トレイトを実装し、reverse
メソッドを再定義します (効率化のためだと思います)。
sealed abstract class List[+A] extends LinearSeq[A]
with LinearSeqOptimized[A, List[A]]
override def reverse: List[A] = {
//faster impl without foreach iteration
...
}
ここで、LinearSeqOptimized
は単に まで続く特性のもう 1 つの「チェーン」ですSeqLike[A, Repr]
。
したがって、一般的な「インターフェース」を使用して「動作」を指定する方法、中間の「インターフェース」が何らかの「デフォルト」実装を提供する方法、およびすべてのサブ「インターフェース」とサブタイプがすべて利益を得る方法を見ることができます。戻り値の型を「独自の」型に保ちながら、その実装の。ふぅ。紛らわしいですね!