コンテキスト:.NET 4.0、C#C#ジェネリックスとインターフェイスの実装を使用
私はいくつかのサービスを提供するためにそれらを実装する一連のインターフェイスと一連のクラスを作成しています。クライアントは具体的なクラスを使用しますが、インターフェイスをパラメータ型として宣言したメソッドを呼び出します。
簡略化した例はこの1つである:
namespace TestGenerics
{
// Interface, of fields
interface IField
{
}
// Interface: Forms (contains fields)
interface IForm<T> where T : IField
{
}
// CONCRETE CLASES
class Field : IField
{
}
class Form <T> : IForm<T> where T : IField
{
}
// TEST PROGRAM
class Program
{
// THIS IS THE SIGNATURE OF THE METHOD I WANT TO CALL
// parameters are causing the error.
public static void TestMethod(IForm<IField> form)
{
int i = 1;
i = i * 5;
}
static void Main(string[] args)
{
Form<Field> b = new Form<Field>();
Program.TestMethod(b);
}
}
}
コードは、私には理にかなって、私は、コンパイラのエラーを取得:
Argument 1: cannot convert from '
TestGenerics.Form<TestGenerics.Field>
' to 'TestGenerics.IForm<TestGenerics.IField>
' TestGenerics
私は私が間違ってやっているかわからないんだけど私はインターネット上の多くのページを読んだが、誰も私の問題を解決しなかった。
はそれほど私が構築しようとしているかのアーキテクチャを変更しないと解決策はあります:
編集:私は、彼らがそれらを実装する具体的なclasesの独立していなければならないような方法でインタフェースを設計し。コンクリートのclaseはdllから読み込むことができますが、ほとんどのアプリケーションはインターフェイスで動作します。場合によっては、具体的なクラスを使用する必要があります。特に、直列化が必要なクラスを使用する場合には必要です。
ありがとうございます。
アレハンドロ
の
。具体的には、['out'ジェネリック修飾子](http://msdn.microsoft.com/en-us/library/dd469487.aspx)をあなたの署名' interface IForm T:IField'に追加すると動作します。しかし、これは他の制限/考慮事項を追加するので、あなたの現在の設計/使用に該当するかどうかはコメントできません。 –
私はこのデザインで何を達成しようとしているのか不思議です。 – sidesinger
両方のアンワに対しておかげさまで、本当に親切でした。私はなぜそのように解決策を検討したのかを説明する編集を追加しましたが、両方の問題が私の問題を解決することができます。敬具。 – Sugar