你会如何处理这种设计?

时间:2009-01-22 18:18:40

标签: c# interface

ControlA接受IInterfaceB,其属性类型属性 List<unknownType>

如果发生ControlA,我需要在unknownType ...

的列表中添加IInterfaceB的新实例

unknownType需要特定的属性,所以我立刻认为它可能是一个接口,但很快就意识到接口无法实例化......

你会如何设计这个系统?

编辑当前的继承链如下所示:

topLevelClass -> baseObject -> IBaseObject (which is implemented in topLevelClass)

所以,如果我在链中添加了一个新类,则需要进行继承和实现,这是不可能的(afaik)

4 个答案:

答案 0 :(得分:1)

如果我正确地解释了这一点,你可以在unknownType上添加一个约束,使其成为包含你需要的属性的某个接口:

class ControlA
{
    void Frob<T>(IInterfaceB<T> something) where T : IHasSomeProperties, new()
    {
        something.ListOfT.Add(new T() { SomeProperty = 5 });
        something.ListOfT.Add(new T() { SomeProperty = 14 });
    }
}

答案 1 :(得分:0)

对类型的限制是否有效?

List<T> where T : IInterface

答案 2 :(得分:0)

您的规范不够具体,无法很好地回答,但请尝试对T进行约束。

public interface IInterfaceB<T>
    where T : new()
{
    List<T> Whatever { get; }
}

这允许您这样做:

T iDoNotCare = new T();

答案 3 :(得分:0)

为什么List必须是unknowntype?为什么它不能成为一个真正的类,具有构造函数所需的真实属性供您实例化?如果需要扩展该类,则可以继承该类。根据你提供的信息,如果你需要的只是进入这个List的类中的一些属性,那么一个好的老类应该可以做到。