Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将同一父类的不同对象传递给承载泛型派生类对象的构造函数/方法_C# - Fatal编程技术网

C# 将同一父类的不同对象传递给承载泛型派生类对象的构造函数/方法

C# 将同一父类的不同对象传递给承载泛型派生类对象的构造函数/方法,c#,C#,我们有家长课 public class ParentClass { int GeneralVariable; } 然后是一个派生类(只是一个保存信息的类) 然后是另一个派生类(仅包含信息的类) 然后是一个只能“容纳”这两个派生类中的一个的类: public class HousingClass : UnrelatedImportantClass { public void DoWorkingOnDerivedClasses(){} } 然后是一个承载所有内容的类。HostCl

我们有家长课

public class ParentClass
{
    int GeneralVariable;
}
然后是一个派生类(只是一个保存信息的类)

然后是另一个派生类(仅包含信息的类)

然后是一个只能“容纳”这两个派生类中的一个的类:

public class HousingClass : UnrelatedImportantClass
{
    public void DoWorkingOnDerivedClasses(){}
}
然后是一个承载所有内容的类。HostClass将调用HousingClass上的方法来处理DerivedClass

public class HostClass
{
    List<HousingClass> Housings = new List<HousingClass>();
}
公共类主机类
{
列表=新列表();
}
在这个住房类中,我希望能够“安置”DerivedClassOne或DerivedClassII,并且能够在任何一个派生类上“工作”。理想情况下,我不希望有太多的重载c-TOR或方法,也不希望有太多的类变量定义不同的派生类。现在,这就是“住房”类的现状,我预计它在不久的将来会变得笨重和难以维护


归根结底,我追求的是什么设计原则,简单的情况下会是什么样子?现在父类不是抽象的,但这对我所追求的有帮助吗

泛型类将部分满足您的需求-您的“housing”类仍将限于使用“parent”方法,但外部调用方将能够使用正确派生类的方法/属性

public class HousingClass<T> where T : ParentClass
{
    public T Derived {get;set;}

    public void Method()
    {
      // can only use methods/properties from ParentClass
      Console.WriteLine(Derived.GeneralVariable);
    }
}

你想让HousingClass只处理派生类而不处理父类吗?你可以传递基类或使用接口。Chetan,如果我可以处理派生类,那不意味着我也可以访问父类吗?Jonathan,当我尝试传递基类时,我只能处理基类信息,而不能处理派生类信息。尽管我很可能实现了错误的方面?@Surlistyc,那么您需要详细说明基类和派生类之间的区别。因为我们不知道“派生特定变量”是什么。用例更好地描述用例。因为使用接口或基类意味着您有一个契约,可以对不同的实现执行相同的操作。因此,实际上,所有派生类都有在某个点使用的父类信息,但派生类中的信息特定于该类。一个用例应该是这样的,LivingBeing(父类)有年龄、体重等。。。人类(衍生类)有词汇、职业等。。。蛇(DerivedClass)有毒液,它能在数组或列表中制造
外壳
外壳
吗?OP没有详细说明用例,但这可能是OP需要一个
Housing
类的原因。ParentClass和DeriveClass只是数据类。所以,HousingClass就是我想要对其中一些变量起作用的地方。有时取决于父类变量,有时取决于派生类变量,具体取决于工作流。HousingClass已经继承了另一个与ParentClass不相关的类。我现在意识到,我真的应该一开始就把这个问题提出来,因为这很重要。Housing类将是使用它的另一个类的列表中的许多对象之一。@Surlistyc仍然不清楚您希望如何使
public void doorkingUnderivedClass(){}
工作。。。。基本上,让单个类神奇地同时具有通用性,并且能够处理从
ParentClass
派生的所有类的每个属性是非常令人困惑的。另外,我也不确定“HousingClass已经继承了另一个与ParentClass无关的类”——这与我的帖子有什么关系……我想这就是我被卡住的地方。我指的是继承,我不能有公共类HousingClass,其中t:ParentClass,因为它已经继承了“unrelatedImportClass”,或者有其他方法来编写类存根吗?公共类住房类T:ParentClass:UnrelatedImportClass在哪里?另外,为什么我只能从类内部使用ParentClass-specific,而可以从外部使用派生的specific?合理的问题。
public class HostClass
{
    List<HousingClass> Housings = new List<HousingClass>();
}
public class HousingClass<T> where T : ParentClass
{
    public T Derived {get;set;}

    public void Method()
    {
      // can only use methods/properties from ParentClass
      Console.WriteLine(Derived.GeneralVariable);
    }
}
DerivedClassOne d = new DerivedClassOne();
HousingClass<DerivedClassOne> house = new HousingClass<DerivedClassOne>
     {  Derived = d };
house.Derived.DerivedSpecificVariableOne = 42;