Boj*_*zec 1 c# oop inheritance downcast
两个类,D1并且D2从一个抽象基类派生B.他们每个人都在分享共同声明公共接口B,但他们每个人可能也有自己特定的公共接口(例如D2具有D2.Bar()这才有用D2对象):
public abstract class B
{
public int N { get; set; }
public abstract void Foo();
}
public class D1 : B
{
public override void Foo()
{
}
}
public class D2 : B
{
public override void Foo()
{
}
public void Bar()
{
}
}
Run Code Online (Sandbox Code Playgroud)
我不断派生对象的组合在单个集合,(如表),因为有时候我不得不打电话共同(继承)在集合中的所有对象,但有时我想调用方法Bar()的D2唯一对象:
var list = new List<B>();
list.Add(new D1());
list.Add(new D2());
foreach(var b in list)
if(b is D2)
(b as D2).Bar();
Run Code Online (Sandbox Code Playgroud)
我觉得代码闻到了这里.向下倾斜是一个坏主意,根据类型检查做出决定是个坏主意.如果我移动Bar()到基类,在D1对象上调用它是没有意义的(包含的实现是D1.Bar()什么?).界面和组合也没有帮助.我觉得这是一种非常普遍的情况,我想知道这种情况下的最佳做法是什么?如何避免向下转换但允许调用特定于派生类型的公共方法?
在我看来,实际上"检查和降低" 恰好适合您的描述:
有时我想只在D2对象上调用Bar():
现在这是一个奇怪的要求,但如果它是一个要求,我认为以一种简单的方式实现它是合理的,而不是为基类上没有意义的操作添加无操作实现.
但是,我会稍微改变一下:
foreach (var d2 in list.OfType<D2>())
{
d2.Bar();
}
Run Code Online (Sandbox Code Playgroud)
现在这说明你的意思:)
| 归档时间: |
|
| 查看次数: |
84 次 |
| 最近记录: |