C# 在基类构造函数中使用抽象类作为参数,以便在派生类中具有更具体的类型

C# 在基类构造函数中使用抽象类作为参数,以便在派生类中具有更具体的类型,c#,oop,inheritance,C#,Oop,Inheritance,来自数据科学,我试图学习面向对象编程(oop),以便使用c#进行软件开发 我正试图建立一个基类(例如Aliments),从中派生一些其他更具体的自定义列表类(例如水果和蔬菜)。另一方面,我有来自食物的水果和蔬菜课程。最后,我希望水果/蔬菜的实例有一个蔬菜/水果属性列表(以及一些特定于水果和蔬菜类的属性和方法)。但是我希望在Aliments基类中实现这个列表属性,并使用一些方法来管理它(例如RemoveIPE()、SortBySize()…) 我试图在Aliments类中放置一个列表属性,然后让派

来自数据科学,我试图学习面向对象编程(oop),以便使用c#进行软件开发

我正试图建立一个基类(例如Aliments),从中派生一些其他更具体的自定义列表类(例如水果和蔬菜)。另一方面,我有来自食物的水果和蔬菜课程。最后,我希望水果/蔬菜的实例有一个蔬菜/水果属性列表(以及一些特定于水果和蔬菜类的属性和方法)。但是我希望在Aliments基类中实现这个列表属性,并使用一些方法来管理它(例如RemoveIPE()、SortBySize()…)

我试图在Aliments类中放置一个列表属性,然后让派生类(Fuits/Vegs)使用一个或多个列表调用基构造函数

我试过这样的方法:

public abstract class Aliment
{
    public int Ripeness;
}

public class Fruit : Aliment
{
    // be a fruit
}

public abstract class Aliments
{
    public Aliments(List<Aliment> alimentList)
    {
        AlimentList = alimentList;
    }

    public List<Aliment> AlimentList { get; private set; }

    public void RemoveRipe()
    {
        //...
    }
}

public class Fruits : Aliments
{
    public Fruits(List<Fruit> fruitList)
        : base(fruitList)
    {

    }
}
public abstract class Aliments<T> where T : Aliment
{
    public Aliments(List<T> alimentList)
    {
        AlimentList = alimentList;
    }
    public List<T> AlimentList { get; private set; }
}
公共抽象类语言
{
公众的成熟度;
}
公共类水果:食品
{
//是水果吗
}
公共抽象类语言
{
公共食品(列表食品列表)
{
赡养费清单=赡养费清单;
}
public List AlimentList{get;private set;}
公共图书馆
{
//...
}
}
公共类水果:营养素
{
公众水果(水果清单)
:基本(结果列表)
{
}
}
主要的问题是水果列表不能转换成食物列表。此外,整个操作的要点是每个水果实例都有一个实际水果的列表(这样我就可以访问水果的具体方法)。我有办法做到吗?我走得好吗? 提前谢谢


p.S.抱歉,如果它是重复的,我真的不知道如何表述问题以便搜索它

当我们说不能将
列表
转换为
列表
时,很大程度上取决于我们所说的“转换”是什么意思

如果您有一个
列表
,并且您想要一个
列表
,您可以通过创建一个新列表来实现这一点。例如,如果
结果列表
列表

我们不能做的是将
列表
转换为
列表

为什么??因为如果我们可以,那么我们就可以做到:

var alimentList = (List<Aliment>)fruitList;
alimentList.Add(new Vegetable());
这不会给你一个编译器错误,但这显然不是你想要的行为

这样的泛型类可能会对您有所帮助:

public abstract class Aliment
{
    public int Ripeness;
}

public class Fruit : Aliment
{
    // be a fruit
}

public abstract class Aliments
{
    public Aliments(List<Aliment> alimentList)
    {
        AlimentList = alimentList;
    }

    public List<Aliment> AlimentList { get; private set; }

    public void RemoveRipe()
    {
        //...
    }
}

public class Fruits : Aliments
{
    public Fruits(List<Fruit> fruitList)
        : base(fruitList)
    {

    }
}
public abstract class Aliments<T> where T : Aliment
{
    public Aliments(List<T> alimentList)
    {
        AlimentList = alimentList;
    }
    public List<T> AlimentList { get; private set; }
}

通过为泛型参数
T
指定
Fruit
,您的
AlimentList
属性现在被定义为
List
。编译器只允许您向其添加
水果

从食物中继承一种特定的水果可能是有道理的(我必须查一下,有一天会用在一句话中。)但是你需要收集一些水果吗
public abstract class Aliments<T> where T : Aliment
{
    public Aliments(List<T> alimentList)
    {
        AlimentList = alimentList;
    }
    public List<T> AlimentList { get; private set; }
}
public class Fruits : Aliments<Fruit>
{
    public Fruits(List<Fruit> alimentList) : base(alimentList)
    {
    }
}