【问题标题】:Hiding/Overriding base class method with params in C#在 C# 中使用参数隐藏/覆盖基类方法
【发布时间】:2015-03-08 18:44:25
【问题描述】:

我有一个抽象类,它有一个带有 params 参数的方法,如下所示。我想用一个在继承类中采用一定数量的参数而不是参数的方法来覆盖和隐藏这个方法。

public abstract class BaseClass{
    public List<int> list = new List<int>();
    public void Add(params int[] numbers){
        list.AddRange(numbers);
    }
}

public class ChildClass : BaseClass{
    public override void Add(int a, int b, int c){
        base.Add(a, b, c);
    }
}

这可行,但基类的 Add 函数仍然对外部可见,并且子类中的 Add 函数似乎没有覆盖它。有什么办法吗?

【问题讨论】:

    标签: c# inheritance polymorphism overriding abstract-class


    【解决方案1】:

    我想用一个在继承类中采用一定数量的参数而不是参数的方法来覆盖和隐藏这个方法。

    你不能。那会破坏继承。考虑以下代码:

    BaseClass bc = new ChildClass();
    bc.Add(0, 1);
    

    那个要编译——那么你希望它做什么呢?如果您期望具有 3 个参数的方法替换原始方法,那么大概您不希望它编译 - 但 bc 的编译时类型只是 BaseClass,而不是ChildClass.

    你可以重载BaseClass.Add(你不需要new,因为它没有与基类方法相同的签名),但你不能替换 em> 使用更严格的形式。

    【讨论】:

    • 谢谢。我正在考虑其他方法来实现这一点。我在中间添加了另外 2 个抽象类,并使基的方法受保护。其中一个公开方法,一个隐藏。这使我的类图更加复杂。当使用不需要的参数数量时,也有抛出异常的方法,但我不会觉得安全。
    • @SirKurt:如果每个具体类都有一组不同的公开方法,那么从客户端的角度来看,抽象基类(可能只有受保护的方法)并没有多大用处。它可能允许您对实现进行一些重用,但它对客户端抽象的贡献不大。
    • 虽然如果你唯一的动机是重用实现,也许只是告诉你的客户使用组合而不是继承(或者让他们调用静态实用程序方法)。
    猜你喜欢
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    相关资源
    最近更新 更多