使用泛型实现接口

时间:2012-07-25 12:11:41

标签: c# generics interface

我是仿制药的新手,需要一些帮助。

我想为所有“变换器”类创建一个接口来实现。要成为“变换器”,该类必须包含至少一个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;
    }
}

让我们使用GENERICS来定义界面:
提出想法!

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

问题:
如果我在接口中使用泛型,我的具体类是LITERALLY强制执行以下内容:

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 个答案:

答案 0 :(得分:2)

可能将通用参数添加到接口定义:

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

并实现您需要的所有映射:

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

答案 1 :(得分:1)

试试这个:

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

然后,当您实现界面时,您的类看起来像:

public class Transformer : ITransformer<XmlDocument>
{
    public XmlDocument MapTo(XmlDocument t)
    {
        throw new NotImplementedException();
    }
}

答案 2 :(得分:1)

您需要使ITransformer 接口通用。所以,你想要这个:

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

然后,在实现接口时,类可以向接口传递他们希望使用的类的类型参数:

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)提供实施。

答案 3 :(得分:0)

我认为你要做的是拥有以下界面:

public interface ITransformer<TEntity> {
    public TEntity MapTo(TEntity entity);
}