gpt4 book ai didi

c# - 派生类中引入的公共(public)接口(interface)

转载 作者:太空宇宙 更新时间:2023-11-03 19:14:16 24 4
gpt4 key购买 nike

D1D2 这两个类派生自抽象基类B。它们每个都共享在 B 中声明的通用公共(public)接口(interface),但它们每个也可能有自己特定的公共(public)接口(interface)(例如 D2D2.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()
{
}
}

我在单个集合(例如列表)中混合派生对象,因为有时我必须对集合中的所有对象调用通用(继承)方法,但有时我想调用 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();

我觉得这里的代码有味道。向下转型是个坏主意,根据类型检查做出决定是个坏主意。如果我将 Bar() 移动到基类,在 D1 对象上调用它就没有意义(D1.Bar() 的实现是什么 包含?)。界面和组合也无济于事。我觉得这是一种非常普遍的情况,我想知道在这种情况下最佳做法是什么?如何避免向下转型但允许调用特定于派生类型的公共(public)方法?

最佳答案

在我看来,根据您的描述,“check and downcast”实际上恰好是合适的:

sometimes I want to call Bar() on D2 objects only:

现在这是一个有点奇怪的要求,但如果它一个要求,我认为以直接的方式实现它是合理的,而不是为不需要的操作添加空操作实现在基类上有意义。

但是,我会略有不同:

foreach (var d2 in list.OfType<D2>())
{
d2.Bar();
}

现在这正是你的意思:)

关于c# - 派生类中引入的公共(public)接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18274772/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com