在子类的override方法中调用父类的父类的未被重写的方法

2023-11-17

今天做一个自定义控件,扩展TableLayoutPanel这个控件加一些自己的属性,重写OnPaintBackground这个虚方法,

控件的继承关系是这样的:
Control
  ScrollableControl
    Panel
      TableLayoutPanel

这个虚方法在Control类中被定义,在ScrollableControl中被重写,在TableLayoutPanel中被又一次重写,
我自己的控件继承了TableLayoutPanel控件,因为TableLayoutPanel对OnPaintBackground方法重写时会进行对表格边框绘画,
而我仅仅需要给我画出背景,不需要边框,那么自然而然的想到下面的代码:

 1     public class BaseClass
 2     {
 3         protected int i { get; set; }
 4 
 5         protected virtual string GetString()
 6         {
 7             i = 1;
 8             return "BaseClass";
 9         }
10     }
11 
12     public class SubClass : BaseClass
13     {
14         protected override string GetString()
15         {
16             //return base.GetString();
17             base.i = 2;
18             return "SubClass";
19         }
20     }
21 
22     public class SubSubClass : SubClass
23     {
24         protected override string GetString()
25         {
26 
27             //want to call base.base.GetString
28             base.i = 3;
29             return "SubSubClass";
30         }
31     }
32 
33     public class MyClass : SubSubClass
34     {
35         protected override string GetString()
36         {
37 
38             MethodInfo miOnPaintBackground = typeof(SubClass).GetMethod(
39                                        "GetString",
40                                        BindingFlags.Instance | BindingFlags.NonPublic,
41                                        Type.DefaultBinder,
42                                        new Type[] { },
43                                        null);
44 
45 
46             object o = miOnPaintBackground.Invoke(this as SubClass, null);
47 
48             return (string)o;
49         }
50 
51         public string CallMethod()
52         {
53             return this.GetString();
54         }
55     }
56 
57     public class Program2
58     {
59         [STAThread]
60         static void Main()
61         {
62             MyClass m = new MyClass();
63 
64             string s = m.CallMethod();
65 
66             Console.WriteLine(s);
67 
68         }
69     }

很不幸,溢出了,是死循环,反射回来的并不是基类的基类的方法,而是我MyClass里面重写的方法。有请google大神出场,得到两篇文章:

http://stackoverflow.com/questions/4357729/use-reflection-to-invoke-an-overridden-base-method

http://blogs.msdn.com/b/rmbyers/archive/2008/08/16/invoking-a-virtual-method-non-virtually.aspx

我们改造下我自己的类:

 1     public class MyClass : SubSubClass
 2     {
 3         protected override string GetString()
 4         {
 5 
 6             MethodInfo miOnPaintBackground = typeof(SubClass).GetMethod(
 7                                        "GetString",
 8                                        BindingFlags.Instance | BindingFlags.NonPublic,
 9                                        Type.DefaultBinder,
10                                        new Type[] { },
11                                        null);
12 
13 
14 
15             var ftn = miOnPaintBackground.MethodHandle.GetFunctionPointer();
16             var func = (Func<string>)Activator.CreateInstance(typeof(Func<string>), this as SubClass, ftn);
17             string s = func();
18 
19             //object o = miOnPaintBackground.Invoke(this as SubClass, null);
20 
21             return s;
22         }
23 
24         public string CallMethod()
25         {
26             return this.GetString();
27         }
28     }

ok,得到我们先要的结果SubClass,越过了基类的重写,执行了基类的基类的protected override方法

转载于:https://www.cnblogs.com/binsys/archive/2013/04/18/3029733.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在子类的override方法中调用父类的父类的未被重写的方法 的相关文章

随机推荐

  • SQL中字符串截取、连接、替换等函数的用法

    一 SQL中SUBSTRING函数的用法 1 功能 返回字符 二进制 文本或图像表达式的一部分 2 语法 SUBSTRING expression start length 3 QL 中的 substring 函数是用来抓出一个栏位数据中的
  • OpenVSwitch简介

    本文主要介绍Open VSwitch 虚拟交换机的概述内容 阅读本文可以对OVS Open VSwitch 有一个大致的了解 那么本文主要回答了这样几个问题 1 虚拟交换机是什么 干什么 2 虚拟网络和OVS 3 OVS的组件有哪些 4 使
  • 华为OD德科面试+机试记录

    一 机试 6 25 三道编程题 难度偏中 由于时间久远 只记得其中两道题目 1 找车位 动态规划 2 题目不记得了 后面如果找到会补充 双指针 3 高效的任务规划 动态规划 第一题和第二题是做出来了 第三题做出来一点点 当时时间不够 没想出
  • ATT&CK - 入门

    20200922 0 引言 这篇文章记录ATT CK的一些材料阅读 不过题目没有非常明确 因为这部分仅仅是记录了一篇文章 不过这篇文章是一系列文章的第一小节 大题目就是Getting Started的部分 所以 这篇文章就命名为入门 1 A
  • matlab运行代码计时

    tic 此处写的是你自己的代码 times toc disp times
  • 链表查重(递归实现)

    链表查重 递归实现 最开始想到的递归方法 初步估计效率不会太高 但是代码比较容易理解 思路 现在有一个无序的链表 在不清楚元素个数的情况下 无法常规的迭代实现查重 迭代也可以做 且效率较高 我首先想到是否可用递归实现 递归的思路是 从表头元
  • 对数损失和交叉熵损失

    从上述的表达式中看 两者的损失函数本质是一样的 但是这里需要注意的是通常情况下 这两种损失函数所对应的上一层结构不同 log loss经常对应的是Sigmoid函数的输出 用于二分类问题 而cross entropy loss经常对应的是S
  • Linux c获取任意路径的硬盘使用情况

    没有什么好说的 其实就是获取硬盘的statfs信息结构 代码如下 include
  • 利用opencv检测移动的物体----mog2()

    检测移动的物体 opencv具有一个函数是mog2 参考链接 https www jb51 net article 143527 htm
  • ​TinyLlama-1.1B:从零开始训练一个精悍的语言模型

    PaperWeekly 原创 作者 StatNLP 单位 新加坡科技设计大学 TinyLlama 项目旨在在 3 万亿 tokens 上进行预训练 构建一个拥有 11 亿参数的 Llama 模型 经过精心优化 我们 仅 需 16 块 A10
  • java-性能&故障分析工具

    java 性能 故障分析工具 突然想起了 对HR小姐姐的承诺 你要是问我是不是为了福利 我是打死不会承认的 我们公司的技术栈以java居多 那就介绍一下之前自己写的一个性能 故障分析工具吧 也希望能对公司的java开发者有一点点帮助吧 居然
  • makefile是如何自动生成的

    GNU make允许将一个软件项目的代码分开放在不同的源文件里 有改动的时候可以只对改动的文件重新编译 然后重新连接 这种编译管理方法提高了生成目标的效率 make要调用一个makefile文件来实现 Makefile的编写是使用make的
  • 微信html5活动页面制作,完整的微信H5活动页面设计规范

    微信火了H5的专题页面设计也越来越多了 经常有朋友问H5专题设计按什么尺寸来做 有没有统一的规范 这里就给大家分享一套非常完整的关于微信H5活动页面设计的UI视觉设计规范教程 希望对那些刚刚从事微信H5界面设计的小伙伴们提供一些帮助 微信H
  • Caddy2学习笔记——Caddy2反向代理docker版本的DERP中继服务器

    一 个人环境概述 本人拥有一个国内云服务商的云主机和一个备案好的域名 通过caddy2来作为web服务器 我的云主机系统是Ubuntu 我的云主机是公网ip 地址为 43 126 100 78 我备案好的域名是 hotgirl com 后面
  • the “scope“ attribute for scoped slots have been deprecated and replaced by “slot-scope“ since 2.5

    在 VSCode 中运行 Vue 关于作用域插槽时的问题 报出警告 Module Warning from node modules vue vue loader v15 lib loaders templateLoader js Emit
  • (支付宝支付)Spring实现一个项目配置多个信息、付款给对应商户

    如何实现一个项目配置多个商户信息付款给对应商户 最近在对接支付宝支付时 遇到了一个问题 用户在付款时 需要直接付款到指定支付宝账户 这个需求也无可厚非 就像我们公司有四个分公司 分别在北京 上海等地 如果钱只能到总公司的账户上 那在财务结算
  • linux c do while循环,C语言do-while循环

    要执行程序或代码的一部分几次或多次 我们可以使用C语言的do while循环 在do和while之间给出的代码将被执行 直到条件 condition 成为true 在do while循环中 语句在条件之前给出 所以语句或代码将至少有一次执行
  • Wav2lip-GAN 环境配置

    首先使用 conda 创建新的虚拟环境 然后激活这个环境 conda create n myenv python 3 8 activate myenv 使用 git 克隆代码 或者直接下载源码压缩包解压 安装依赖 我使用的豆瓣源 git c
  • 热部署,未测试

    package agent import java lang instrument Instrumentation import java lang instrument UnmodifiableClassException import
  • 在子类的override方法中调用父类的父类的未被重写的方法

    今天做一个自定义控件 扩展TableLayoutPanel这个控件加一些自己的属性 重写OnPaintBackground这个虚方法 控件的继承关系是这样的 Control ScrollableControl Panel TableLayo