0

私はジェネリックスに不慣れで、助けが必要です。

すべての「トランスフォーマー」クラスが実装するためのインターフェースを作成したいと思います。「トランスフォーマー」になるには、クラスに少なくとも1つのバリエーションが含まれている必要がありますT mapTo<T>(T t)

トランスフォーマーの使用方法は次のとおり
です。いくつかのメソッドをオーバーロードします...すばらしいです!簡単そうです!

public class Transformer : ITransformer
{
    public Transformer(IPerson instance)
    {
    }

    public XmlDocument mapTo(XmlDocument xmlDocument)
    {
        // Transformation code would go here...
        // For Example:
        // element.InnerXml = instance.Name;

        return xmlDocument;
    }

    public UIPerson maptTo(UIPerson person)
    {
        // Transformation code would go here...
        // For Example:
        // person.Name = instance.Name;

        return person;
    }
}

ジェネリックスを使用してインターフェースを定義しましょう:素晴らしい
アイデアです!

public interface ITransformer
{
     T MapTo<T>(T t); 
}

問題:
インターフェースでジェネリックスを使用する場合、私の具象クラスは文字通り以下を実装することを余儀なくされます:

public T MapTo<T>(T t)
{
    throw new NotImplementedException();
}

これはクラスの見た目を醜くします

public class Transformer : ITransformer
{
    public Transformer(IPerson  instance)
    {
    }

    public XmlDocument MapTo(XmlDocument xmlDocument)
    {
        // Transformation code would go here...
        // For Example:
        // element.InnerXml = instance.Name;

        return xmlDocument;
    }

    public UIPerson MapTo(UIPerson person)
    {
        // Transformation code would go here...
        // For Example:
        // person.Name = instance.Name;

        return person;
    }

    public T MapTo<T>(T t)
    {
        throw new NotImplementedException();
    }
}
4

4 に答える 4

2

たぶん、インターフェース定義に汎用パラメーターを追加します。

public interface ITransformer<T>
{
     T MapTo(T t); 
}

そして、必要なすべてのマッピングを実装します。

public class Transformer : ITransformer<XmlDocument>, ITransformer<UIPerson>
于 2012-07-25T12:19:09.690 に答える
1

これを試して:

public interface ITransformer<T>
{
    T MapTo(T t);
}

次に、インターフェースを実装すると、クラスは次のようになります。

public class Transformer : ITransformer<XmlDocument>
{
    public XmlDocument MapTo(XmlDocument t)
    {
        throw new NotImplementedException();
    }
}
于 2012-07-25T12:15:47.600 に答える
1

ITransformer インターフェイスをジェネリックにする必要があります。だから、あなたはこれが欲しい:

public interface ITransformer<T>
{
    public T MapTo(T t);
}

次に、インターフェースを実装するときに、クラスは使用したいクラスのtypeパラメーターをインターフェースに渡すことができます。

public class Transformer : ITransformer<XmlDocument>
{
    public XmlDocument MapTo(XmlDocument t)
    {
        //...
    }
}

編集: lazyberezovskyが以下に述べたように、同じインターフェースを複数回実装することを妨げるものは何もありません。

public class Transformer : ITransformer<XmlDocument>, ITransformer<UIPerson>

もちろん、これはとの実装を提供する必要がXmlDocument MapTo(XmlDocument t)ありUIPerson MapTo(UIPerson t)ます。

于 2012-07-25T12:16:02.687 に答える
0

私はあなたがやろうとしていることは次のインターフェースを持っていることだと思います:

public interface ITransformer<TEntity> {
    public TEntity MapTo(TEntity entity);
}
于 2012-07-25T12:16:57.523 に答える