C#泛型接口解决方案

3
我有一个名为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 '>'??
}

“small”,“normal”和“big”是否共享一个基类?如果是的话,我建议在您的类型定义中添加where子句。如果不是,则您可能需要考虑给它们一个基类,这样您就可以扩展您的类型,因为似乎您正在限制您的类型大小。 - JG in SD
我尝试做: class Home<T> where T: small,normal,big{ Man bed<T> } 但是我遇到了错误 :( - SplitXor
看一下这个类似问题的解决方案:https://dev59.com/UHNA5IYBdhLWcg3wNrAy#13717025。 - rob
@EnnioPastore 你需要指定一个公共基类,不能列出你想要限制的类,你应该在接口和Home类上都加上约束,例如:public interface IMan<T> where T : Size{ } public class Home<T> where T : Size { } public abstract class Size { // size objects inherit this } - JG in SD
@EnnioPastore 接口也可以在 where 子句中使用,类型约束需要是类所继承或实现的共同点。 - JG in SD
2个回答

6
您需要使Home也具有通用性:
class Home<T> 
{
    Man<T> bed;

根据评论进行编辑:

如果你不知道会存在什么类型的“Man”,另一个选项是让你的通用类实现一个非通用接口:

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。无关的提示是,建议在这里使用更好的命名方案 - 名称不太有意义...为什么一个“Man”被命名为“bed”?你可能还想查看标准的Capitalization Conventions

参数bed必须更改类型。有时可以是“小”,有时可以是“正常”,有时可以是“大”...我不知道它可能变成什么类型.. - SplitXor
@EnnioPastore,你考虑过创建一个IBed接口,并让Man<T>实现它吗?这样你就可以使用该接口了。 - Reed Copsey
在我看来,使用一个带有类型为IBed的参数的Man类方法可能比Man类实现IBed方法更好。例如:InstanceOfMan.CheckBedSuitablity(InstanceOfIBed)。 - Surya Pratap
@SuryaPratap 是的,我同意 - 但是我试图按照原帖的要求进行匹配。 - Reed Copsey

0

我无法确切地理解你的问题,所以我推断你在困惑如何为房屋设置参数“床尺寸”。

这个问题最好使用枚举来解决。这样你就可以拥有一个描述床尺寸的单一对象。

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

public enum BedSize
{
   Small,
   Medium,
   Large
}

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

这样做可以降低后续确定床的尺寸的复杂度,因此您不必进行反射或类似的麻烦操作。


如果你只需要使用一个类和一个接口,为什么不“就这样做”呢? - Mr. Young

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接