【问题标题】:Inheritance in C# and call to base.X() using overriden function Y()C# 中的继承和使用覆盖函数 Y() 调用 base.X()
【发布时间】:2013-08-03 00:38:28
【问题描述】:

我需要了解 C# 中的继承。我有一个如下所示的课程:

Class BaseClass
{
    public void X()
    {
        //Some code here
        Y();
    }

    public void Y()
    {
        //Some code here
    }
}

现在我想创建另一个派生自 BaseClass 的类(ChildClass)。问题是我想以某种方式覆盖 ChildClass 中的 Y() 函数,当调用 base.X() 函数时,我希望 X() 函数使用 ChildClass 中覆盖的 Y() 函数。

有人建议我在覆盖时对 Y 函数使用 'delegate' 关键字。但是,我不太确定这是否可行。

这可能吗?有什么建议吗?

【问题讨论】:

    标签: c# inheritance


    【解决方案1】:
    class BaseClass
    {
        public void X()
        {
            // Some code here
            Y();
        }
    
        public virtual void Y()
        {
            // Some code here
        }
    }
    
    class ChildClass : BaseClass
    {
        public override void Y()
        {
            // Some code here
        }
    }
    

    如果在某些时候你想在ChildClass 中调用Y()BaseClass 实现,你可以这样做:

    class ChildClass : BaseClass
    {
        public override void Y()
        {
            // Some code here
            base.Y();
        }
    }
    

    【讨论】:

    • 请注意,这并不是真正推荐的模式(从构造函数调用虚方法)。您无法知道覆盖功能是否正确实现。如果它抛出一个异常,这个异常将引发构造函数。从构造函数中抛出异常是不好的。
    • @oɔɯǝɹ:构造函数在 C#/.NET 中抛出异常没有问题,事实上,许多框架类都会这样做。关于在构造函数中调用虚方法的实际问题是 ChildClass.Y() 可能依赖于完全初始化的 ChildClass(特别是 ChildClass 可能拥有的任何私有字段),而在 @987654329 @构造函数运行。
    • @O.R.Mapper:你说得对,我对静态类构造函数的异常感到困惑。那些很讨厌。
    【解决方案2】:

    这是可能的。它被称为template 模式。在基类中声明您的函数 Y(),但将其标记为抽象。在您的派生类中,覆盖此函数。调用 X() 将调用正确的函数。

    【讨论】:

    • 是的,您可以使用虚拟或抽象。这个原则仍然成立。
    猜你喜欢
    • 2022-12-31
    • 2011-01-10
    • 2014-02-17
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多