【问题标题】:c# generics interface solutionc#泛型接口解决方案
【发布时间】:2013-01-13 16:33:02
【问题描述】:

我有一个名为Man 的接口。 在这个接口中,我有方法getList(),它返回一个类型为 T 的列表(依赖于实现接口的类)。 我有 3 个实现 Man 的类:smallnormalbig。 每个类都有getList() 方法,它返回small 列表或normal 列表或big 列表。

interface Man<T>{
  List<T>getList();
}

class small : Man<small>{
  List<small> getList(){
    return new List<small>(); 
  }
}

class normal : Man<normal>{
  List<normal> getList(){
    return new List<normal>(); 
  }
}

class big : Man<big>{
  List<big> getList(){
    return new List<big>(); 
  }
}

现在我有了类:Home,其中包含一个参数 bed,它是 Man 的一个实例。 Bed 可以有多种类型:smallnormalbig。如何声明bed的类型参数?

class Home{
  Man bed<> // what i must insert between '<' and '>'??
}

【问题讨论】:

  • Do smallnormalbig 共享一个公共基类,如果是这样,我建议在你的类型定义中添加一个 where clause,如果没有,你可以想考虑给他们一个基类,这样你就可以了,因为你似乎把你的类型限制在一个大小上。
  • 我试图做:class Home where T: small,normal,big{ Man bed } 但我有错误:(
  • 看看这个类似问题的解决方案stackoverflow.com/questions/1048884/c-overriding-return-types/…
  • @EnnioPastore 你需要指定一个通用的基类,你不能列出你想限制它的类,你应该对接口和Home类都有约束,即: public interface IMan where T : Size{ } public class Home where T : Size { } public abstract class Size { // size 对象继承 this }
  • @EnnioPastore 接口也可以用在 where 子句中,类型约束需要是类继承或实现的共同点。

标签: c# generics interface


【解决方案1】:

您还需要将Home 设为通用:

class Home<T> 
{
    Man<T> bed;

编辑以响应 cmets:

如果您不知道将存在哪种类型的“人”,另一种选择是让您的泛型类实现非泛型接口:

public interface IBed { // bed related things here

public class Man<T> : IBed
{
   // Man + Bed related stuff...

class Home
{
     IBed bed; // Use the interface

然后您可以针对接口定义的共享合约进行开发,并允许在Home 中使用任何类型的IBed


在一个不相关的旁注中,我建议在这里使用更好的命名方案 - 这些名称没有多大意义......为什么“男人”被命名为“床”?您可能还想查看标准Capitalization Conventions

【讨论】:

  • 参数床必须换类型..一次可以是“小”,一次是“正常”,一次是“大”..不知道能变成什么类型​​..
  • @EnnioPastore 您是否考虑过制作一个IBed 接口,并让Man&lt;T&gt; 实现它?然后你可以使用 hte 接口。
  • 恕我直言,在 Man 类中使用带有 IBed 类型参数的方法可能比实现 IBed 方法的 Man 类更好例如:InstanceOfMan.CheckBedSuitblity(InstanceOfIBed)
  • @SuryaPratap 是的,我同意 - 但正在尝试按照书面要求匹配 OP 的要求。
【解决方案2】:

我无法准确确定您的要求,因此我将推断您无法确定如何为房屋设置参数“床尺寸”。

使用枚举可能会更好地解决这个问题。这样你就可以有一个对象来描述床的大小。

public interface IBed
{
    BedSize BedSize { get; set; }
}

public enum BedSize
{
   Small,
   Medium,
   Large
}

public class House : IBed
{
  public BedSize BedSize { get; set; }
}

这降低了以后确定床尺寸的复杂性,因此您不必进行反思或类似的讨厌的事情。

【讨论】:

  • 如果您只需要使用一个类和一个接口,为什么不这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多