繁体   English   中英

将约束应用于类,遵守接口

Apply constraint to class, adhere to interface

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我要求能够执行许多外部模型到我自己的内部模型的转换。

我决定应用适配器模式,但我想使其尽可能通用。 如此有效,我希望它能够处理两个“单个” POCO,但是如果我需要通过/调整一个集合,那么它也必须工作,例如:

IEnumerable<IAdaptee> OR IList<TAdaptee>

并返回我自己的适应对象:

IEnumerable<IAdapted> OR IList<TAdapted>

我想做以下事情:

public interface IGenericAdapter
{
    TAdapted Adapt<TAdapted,TAdaptee>(TAdaptee adaptee);
}

当我构建“ Adapter”类并实现上述接口时,我遇到的困难是出现约束不匹配错误。 这当然是有道理的,因为如果我将约束应用于实现接口的类,而接口没有约束,则当然会发生错误。

所以:

public class AToBAdapter
{
public TAdapted Adapt<TAdapted,TAdaptee>(TAdaptee adaptee)
where TAdapted: IList<FooAdapted>
where TAdaptee: IList<FooAdaptee>
{
// I want my constraints to be active here, as I need to perform specific operations here
}
}

上面的工作本身很好,这很好。 但是我想将所有这些隐藏在通用接口的后面,我可以在合适的时候使用它。

当然,一旦添加,由于对接口没有任何约束,但是对实现类的约束,它失败了。

public class AToBAdapter:IAdapterGeneric

什么是神奇的子弹,这将使我能够构建真正的通用适配器-我猜想对接口有某些限制? 铸件? 但需要有关最佳行动方案的帮助。

谢谢,Chud

2 个回复

如果您可以访问外部模型,则可以使用界面作为标记:

public interface IAdaptee { }
public interface IAdapted { }

并将这些接口用作适配器接口约束:

public interface IGenericAdapter<out TAdapted, in TAdaptee>
    where TAdaptee : IAdaptee
    where TAdapted : IAdapted
{
    TAdapted Adapt(TAdaptee adaptee);
}

您可以将此适配器传递给用于适配多个对象的辅助方法(假设适配逻辑对于多个对象保持不变):

public IEnumerable<TAdapted> AdaptMultiple<TAdapted, TAdaptee>
    (IEnumerable<TAdaptee> adaptees, IGenericAdapter<TAdapted, TAdaptee> adapter)
    where TAdaptee : IAdaptee
    where TAdapted : IAdapted
{
    return adaptees.Select(adapter.Adapt);
}

例如,我们可以构造以下具体类:

public class ConcreteAdaptee : IAdaptee { }

public class ConcreteAdapted : IAdapted { }

public class ConcreteAdapter : IGenericAdapter<ConcreteAdapted, ConcreteAdaptee>
{
    public ConcreteAdapted Adapt(ConcreteAdaptee adaptee)
    {
        // Adapt Logic

        return new ConcreteAdapted();
    }
}

并像这样调整它们:

IGenericAdapter<ConcreteAdapted, ConcreteAdaptee> adapter = new ConcreteAdapter();

var adaptee = new ConcreteAdaptee();
var adapted = adapter.Adapt(adaptee);

var adaptees = new List<ConcreteAdaptee>();
var adapteds = AdaptMultiple(adaptees, adapter);

考虑以下示例:

interface IDog
{
    void Bark();
}

interface ICat
{
    void Meow();
}
class SomeDog : IDog
{
    public void Bark()
    {
        Console.WriteLine(@"bark bark");
    }
}

class SomeCat : ICat
{
    public void Meow()
    {
        Console.WriteLine(@"meow meow");
    }
}

class CatToDogAdapter : IDog
{
    private ICat cat;
    public CatToDogAdapter(ICat cat)
    {
        this.cat = cat;
    }

    public void Bark()
    {
        cat.Meow();
    }
}

new Dog().Bark(); // bark bark
new CatToDogAdapter().Bark();// meow meow

这就是适配器的工作方式。

假设您有一个MyAdaptedData模型,并且需要从agoda,预订和Tripadviser获取包含您需要编写适配器的每个预订模型的数据,其中包含HotelName,Name,PropertyName

AgodaAdapter : MyAdaptedData{
    public AgodaAdapter(AgodaModel agodaModel){
        ....
    }
    public stirng HotelName{
        get{
            return agodaModel.HotelNamebyAgoda;
        }
    }
    ....
}

预订和Tripadvisor一样。 适配器模式可帮助您从外部模型检索必要的数据。

然后,您需要根据适配器类型创建特定的适配器。 使用工厂方法模式

MyAdaptedData AdaptersFactory(object adaptee){

    if(adaptee is AgodaModel)
        return new AgodaAdapter(adaptee);
    ....
    if(adaptee is XBookingModel)
        return new XBookingAdapter(adaptee);
}
4 Android Room将约束应用于关系

我知道Room让我们使用@Relation关键字建立1-N关系。 尽管我想知道是否可以对这种关系应用条件。 假设我有以下POJO 上面的方法让我查询一个用户及其所有宠物。 尽管我可以通过某种方式查询用户及其最近的10只宠物? 还是某个用户及其所有属于特定类型的宠物? 谢 ...

5 自动将约束应用于SQLAlchemy查询

我正在寻找一种最好的方法来对特定的User可以从数据库中检索到的内容进行精细控制。 当前的设计实现了User和License模型,这是一对多的关系,并且具有许多连接的实体,例如Country , City , Person等等。 某些实体(例如Country )应仅限于根据“ Licen ...

6 什么新应用于接口意味着什么?

我理解如果T是一个结构,那么这相当于创建一个空结构(合理的空值):: 但是,给出以下代码段:: 创建什么以及新界面的用处是什么? ...

2014-02-26 19:16:28 1 106   go
8 扩展方法可以应用于接口吗?

是否可以将扩展方法应用于接口? (C#问题) 例如,这是为了实现以下目标: 创建ITopology界面 为此接口创建扩展方法(例如public static int CountNodes(this ITopology topologyIf)) 然后在创建实现IT ...

10 将接口应用于具有相同属性的类的通用方法

我有一个带有一串string属性的接口: 而一个碰巧具有相同属性的类,却没有实现接口。 假设我无权修改该类(即该类在外部DLL中实现): 我编写了一个泛型类,给定外部类的一个对象,该类将使用该对象的所有值返回该接口的实例化: 可以这样使用: 问题在于它仅适用于s ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM