在一个接口后面隐藏多个类
本文关键字:隐藏 一个 接口 | 更新日期: 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;