实现作为接口的接口属性
本文关键字:接口 属性 实现 | 更新日期: 2023-09-27 18:27:16
给定下面的代码,我得到以下错误,即父级和子级没有实现IPparent/IChild。我显然误解了什么。实现这一点的正确方法是什么?还是我最好使用抽象类?
为了增加更多细节,这些类在EF中使用,所以我需要实现,而不是使用抽象类型。"属性必须是有效的实体类型,并且属性应该具有非抽象的getter和setter。"
public interface IParent
{
int ParentId { get; set; }
IChild Child { get; set; }
}
public interface IChild
{
int ChildId { get; set; }
IParent Parent { get; set; }
}
public class Parent : IParent
{
public int ParentId { get; set; }
public Child Child { get; set; }
}
public class Child : IChild
{
public int ChildId { get; set; }
public Parent Parent { get; set; }
}
您尝试过接口的显式实现吗?
public class Parent : IParent
{
public int ParentId { get; set; }
public Child Child { get; set; }
public int IParent.ParentId { get { return ParentId; } set { ParentId = value; } }
public IChild IParent.Child { get { return Child; } set { Child = value; } }
}
public class Child : IChild
{
public int ChildId { get; set; }
public Parent Parent { get; set; }
public int IChild.ChildId { get { return ChildId; } set { ChildId = value } } }
public IParent IChild.Parent { get { return Parent; } set { Parent = value } } }
}
注意:我实际上并没有尝试编译它,在显式实现的getter和setter中可能存在一些歧义,因此您可能必须获取和设置支持字段,而不是属性。
您的IPparent和IChild将属性定义为IChild和IPparent,而不是Child和Parent,即使您可以将它们分配给属性。因此,原始代码:
public class Parent : IParent
{
public int ParentId { get; set; }
public Child Child { get; set; }
}
public class Child : IChild
{
public int ChildId { get; set; }
public Parent Parent { get; set; }
}
应该变成:
public class Parent : IParent
{
public int ParentId { get; set; }
public IChild Child { get; set; }
}
public class Child : IChild
{
public int ChildId { get; set; }
public IParent Parent { get; set; }
}
您不能更改接口的签名,您可以执行类似的操作
public class Parent : IParent
{
private Child _child;
public int ParentId { get; set; }
public IChild Child
{
get { return _child; }
set { _child = (Child)value; } //dangerous zone
}
}
public class Child : IChild
{
private Parent _parent;
public int ChildId { get; set; }
public IParent Parent
{
get { return _parent; }
set { _parent = (Parent)value; } //dangerous zone
}
}
由于错误表明您的类需要实现接口,因此需要将类定义如下:
public class Parent : IParent
{
public int ParentId { get; set; }
public IChild Child { get; set; }
}
public class Child : IChild
{
public int ChildId { get; set; }
public IParent Parent { get; set; }
}