C# 分配包含更派生类的列表时,将实体关系设计应用于抽象类时出错

C# 分配包含更派生类的列表时,将实体关系设计应用于抽象类时出错,c#,abstract-class,entity-relationship,C#,Abstract Class,Entity Relationship,我正在定义两个抽象类:AC1,和AC2AC1有一个属性(变量),它是AC2类型的List(List)(这是我定义一对多关系的方式) 然后,我定义了R1,它来自AC1(R1:AC1)和R2:AC2。当我编写R1的构造函数时,问题就出现了。我正在作为参数传递一个R2类型的列表(List),然后尝试将其分配给AC1(List)中定义的属性(变量),但这失败了,因为它无法隐式地从R2转换为AC2(即使R2来自AC2) 代码示例: abstract class AC2 { //several pr

我正在定义两个抽象类:
AC1
,和
AC2
AC1
有一个属性(变量),它是
AC2
类型的
List
List
)(这是我定义一对多关系的方式)

然后,我定义了
R1
,它来自
AC1
R1:AC1
)和
R2:AC2
。当我编写R1的构造函数时,问题就出现了。我正在作为参数传递一个R2类型的列表(
List
),然后尝试将其分配给AC1(
List
)中定义的属性(变量),但这失败了,因为它无法隐式地从R2转换为AC2(即使R2来自AC2)

代码示例:

abstract class AC2
{
    //several properties and methods here
}

abstract class AC1
{
    List<AC2> dammVariable {get; set;} //problematic variable (see class R1)
    //other stuff here
}

class R2 : AC2
{
    //some properties exclusive for R2 here
    public R2(){}
}

class R1 : AC1
{
    //some properties exclusive for R1 here
    public R1(List<R2> r2s)
    {
        this.dammVariable = r2s; //I found the error right here
    }
}
抽象类AC2
{
//这里有几个属性和方法
}
抽象类AC1
{
列出dammVariable{get;set;}//有问题的变量(参见类R1)
//这里还有其他东西
}
R2类:AC2
{
//这里有一些R2专用的属性
公共R2(){}
}
R1类:AC1
{
//这里有一些R1专有的属性
公共R1(列表r2s)
{
this.dammVariable=r2s;//我在这里找到了错误
}
}
我将有一些来自这个抽象类的其他类,但是每次我创建一个来自AC2的类(例如X2),我都需要一个X1类,它有一个
列表

我是否在设计或实施方面失败

我将感谢您的帮助。

首先,我假设dammVariable是受保护的或公共的,因为如果不是,它将失败

其次,C#不能隐式地从List转换为List。您应该使用for循环分配dammVariable的每个元素

class R1 : AC1
    {
        public R1(List<R2> r2s)
        {
            this.dammVariable = r2s;
            this.dammVariable= new List<AC2>();
            for(int i = 0; i<r2s.Count; i++)
            {
                this.dammVariable[i] = r2s[i];
            }
        }
    }
R1类:AC1
{
公共R1(列表r2s)
{
this.dammVariable=r2s;
this.dammVariable=新列表();

对于(inti=0;i,这里有几个问题

  • 首先,您需要将
    dammVariable
    的保护级别至少更改为
    protected
    ,以便在子类中访问它

  • 但是,您将面临类型安全问题:


CS0029:无法将type
System.Collections.Generic.List
隐式转换为
System.Collections.Generic.List

谢谢!但是,我会强制给R1构造函数一个抽象类列表,这不是我想要的。事实上,我已经尝试过了,但是当我尝试用列表实例化R1时(r1r=newr1(r2s)//其中r2s类型为List)我收到一个“无法从R2转换为AC2”错误(错误代码CS1503)请参见编辑。我的意思是传递一个R2列表,而不是AC2。您无法从List转换为List,但您可以将单个R2元素分配给单个AC2元素。嗯,this.dammVariable=r2s;将失败(这是最初的问题)。假设我必须删除该行,我会在for循环中得到一个错误,该错误表示“对象引用未设置为对象实例”。请注意,即使是dammVariable也在“this.dammVariable=new List()”中实例化行,它在局部变量中仍然显示为空值debugger@Jonskeet列出了一些更优雅的方法来实现“工作如魅力”!谢谢。不要将OOP与实体关系模型混淆。OOP更接近网络数据模型,不支持三元和高阶关系、非定向关系、弱实体,确定关系或参与约束。我建议您使用OOP进行系统建模,而不是数据建模。
abstract class AC1
{
    protected IEnumerable<AC2> dammVariable {get; set;}
)