繁体   English   中英

当该子项作为其父项存储在列表中时,如何访问Child类的接口属性?

[英]How can I access a Child class's interface property when that child is stored in a list as its Parent?

我认为这篇文章的标题可能无法很好地解释我的问题,所以这里有一些代码应该希望能更好地解释一下:

interface IFoo {
    IFoo Bar {get; set;}
}

class Parent {

}

class Child1 : Parent, IFoo {

}

class Child2 : Parent, IFoo {

}

class Manager {
    List<Parent> Parents = new List<Parent>();

    Parents.Add(new Child1());
    Parents.Add(new Child2());

    // I want to do something like this:
    Parents[0].Bar = Parents[1];
}

我相信(Parents[0] is IFoo)将评估为true ,但我不能使用Parents[0].Bar因为Parent不包含Bar的定义。 你能解释一下这是为什么吗? 另外,我怎么能有效地做同样的事情(至少在我脑海里) Parents[0].Bar = Parents[1]应该做什么?

希望这是有道理的。 如果需要,我会尽力澄清事情。 在此先感谢您的光临!

使用类型转换:

((IFoo)Parents[0]).Bar

但实际上,如果你依赖于实体,那么你的设计就是糟糕的设计。

如果要进行分配,则需要让代码具有与自己相同的信息,以及与Manager类相同的信息。 这意味着你必须告诉类Parent它知道IFoo,这意味着:

 abstract class Parent : IFoo
{
    public abstract IFoo Bar { get; set; }
}

它现在还声明您无法单独实例化Parent。 从您的评论中,它似乎有意义(您说父母应该没有Bar的实现,只知道它)。 如果这是有意义的,那么它是抽象的,但如果不删除摘要并将Bar的实现添加到Parent,或者如果每个子项的实际实现不同,则将其设置为虚拟。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM