RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 810416
Accepted
Алексей Федотов
Алексей Федотов
Asked:2020-04-06 17:49:52 +0000 UTC2020-04-06 17:49:52 +0000 UTC 2020-04-06 17:49:52 +0000 UTC

从子类调用基类的虚方法

  • 772

相对而言,我有一个基类 A 和它的后继类 B。A 类有一个虚方法,它在后继类中被覆盖。问题:我可以调用尚未在子对象(虚拟对象)上覆盖的基类方法吗?如果可以,如何调用?

class A
{
 public virtual void myMethod() {}
} 

class B : A
{
 public override void myMethod() {}
}

Нужно что бы в вызывающей части программы было что то вроде этого:
B b = new B();
b.myMethod(); // но метод базового класса
c#
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. DreamChild
    2020-04-06T18:03:08Z2020-04-06T18:03:08Z

    通常,C# 有一个关键字base. 有了它,你可以在后代类中访问祖先类的成员。例如像这样:

    class A
    {
        public virtual void myMethod() 
        {
            Console.WriteLine("parent");
        }
    } 
    
    class B : A
    {
        public override void myMethod() 
        {
            base.myMethod(); // вызываете метод базового класса
            Console.WriteLine("child");
        }
    }
    

    如果你写这样的东西:

    B b = new B();
    b.myMethod();
    

    然后输出到控制台

    亲子

    如果只想执行基类方法的逻辑,那么方法应该是这样的:

    public override void myMethod() 
    {
        base.myMethod(); 
    }
    

    但是这真的没有任何意义,因为如果子方法只调用祖先方法,那么这个方法根本不需要声明

    • 5
  2. Best Answer
    default locale
    2020-04-06T18:09:24Z2020-04-06T18:09:24Z

    这当然行不通:

    B b = new B();
    b.myMethod();
    

    因为 这是对类方法的显式调用B。

    如果您需要覆盖该方法并能够调用旧实现,那么您可以为其选择一个新的旧方法:

    /// <summary>
    /// Вызов метода с такими-то особенностями, присущими классу A
    /// Лучше дать ему название, описывающее отличия в поведении от myMethod
    /// </summary>
    public void oldMyMethod()
    {
        base.myMethod();
    }
    

    另一件事是,如果您需要摆脱多态性:

    var a = (A)b;
    //здесь вызывается метод из В, а нужен метод из А
    a.myMethod();
    

    在这种情况下,有必要拒绝虚拟myMethod,因为 它的全部意义在于调用被覆盖的方法。

    class B : A
    {
        //с помощью new прячем метод и ломаем полиморфизм
        public new void myMethod() {}
    }
    
    class A
    {
        //технически у предка можно оставить virtual
        //например, если метод переопределяется в других наследниках.
        //, но в данном случае это теряет смысл.
        public void myMethod() {}
    } 
    

    用这种方法,B.myMethod隐藏A.myMethod。请记住,在阅读代码时,具有相同名称的完全不相关的方法会使开发人员感到困惑。因此,在这种情况下,给方法赋予不同的名称是有意义的。

    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5