实现作为接口的接口属性

本文关键字:接口 属性 实现 | 更新日期: 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; }
}