实现作为接口的接口属性

时间:2014-10-21 15:20:36

标签: c#

鉴于下面的代码,我得到以下错误,父母和孩子不会实现IParent / 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; }
}

4 个答案:

答案 0 :(得分:1)

您是否尝试过明确实现该界面?

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中可能存在一些歧义,因此您可能必须获取并设置支持字段而不是属性。

答案 1 :(得分:0)

您的IParent和IChild将属性定义为IChild和IParent,而不是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; }
}

答案 2 :(得分:0)

由于错误说你的类需要实现接口,所以你需要定义类如下:

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; }
}

答案 3 :(得分:0)

你无法改变界面的签名,你可以做这样的事情

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
    }
}
相关问题