在一个接口后面隐藏多个类

本文关键字:隐藏 一个 接口 | 更新日期: 2023-09-27 18:27:28

下面是我尝试做的一个示例:

public interface IChildItem
{}
public interface IItem
{
    public EntitySet<IChildItem> Children {get;}
}
public class ChildItem1 : IChildItem
{}
public class ChildItem2 : IChildItem
{}
public class Item1 : IItem
{
    public EntitySet<ChildItem1> Children
    {
        get{ return m_children; }
    }
}
public class Item2 : IItem
{
    public EntitySet<ChildItem2> Children
    {
        get{ return m_children; }
    }
}

我正试图将Item1和Item2隐藏在IItem接口后面。

主要问题是我还需要Children属性来返回接口列表(IChildItem)。但编译器说,我这样做是不允许的。类Item1和Item2中缺少EntitySet<IChildItem> Children {get;}。为什么EntitySet<ChildItem1>不等于EntitySet<IChildItem>???

类Item1和Item2是自动生成的(dbml),这就是我不能更改它们的原因。

有什么技巧可以帮我解决这个问题吗?

在一个接口后面隐藏多个类

通用接口是解决方案:

public interface IChildItem
{ }
public interface IItem<T> where T: class
{
    List<T> Children { get; }
}
public class ChildItem1 : IChildItem
{ }
public class ChildItem2 : IChildItem
{ }
public class Item1 : IItem<ChildItem1>
{
    public List<ChildItem1> Children
    {
        get { return null; }
    }
}
public class Item2 : IItem<ChildItem2>
{
    public List<ChildItem2> Children
    {
        get { return null; }
    }
}

您可以使用Generics和Covariance来执行此

public interface IChildItem                                              
{ }                                                                      
public interface IItem<out TChild> where TChild : IChildItem             
{                                                                        
    IEnumerable<TChild> Children { get; }                                
}                                                                        
public class ChildItem1 : IChildItem                                     
{ }                                                                      
public class ChildItem2 : IChildItem                                     
{ }                                                                      
public class Item1 : IItem<ChildItem1>                                   
{                                                                        
    public IEnumerable<ChildItem1> Children                              
    {                                                                    
        get { return null; }                                             
    }                                                                    
}                                                                        
public class Item2 : IItem<ChildItem2>                                   
{                                                                        
    public IEnumerable<ChildItem2> Children                              
    {                                                                    
        get { return null; }                                             
    }                                                                    
}                                                                        
IItem<ChildItem1> variable = new Item1();                                
IItem<IChildItem> variable2 = variable;