在子类的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方法中调用父类的父类的未被重写的方法 的相关文章

  • 用于解析和构建逻辑表达式的 Java 库

    我正在寻找一个 Java 开源库来解析和构建类似 SQL 的表达式 例如评估表达式的有效性 例如 a x or y and b z 另外我想要一个用于构建或扩展表达式的 API 就像是 Expression exp new Expressi
  • 将构造函数作为参数传递给方法

    我是java新手 开始研究构造函数 我看到一些构造函数作为参数传递给方法的示例 请告诉我当构造函数作为参数传递给方法时会发生什么 或者建议我一些链接 我可以在其中获得有关使用构造函数的足够知识 根据您需要传递构造函数的目的 您可以考虑传递供
  • 在 Java 正则表达式中获取多个模式的重叠匹配

    我有同样的问题这个链接 https stackoverflow com questions 18751486 matching one string multiple times using regex in java 但有多种模式 我的正
  • 在 jTextfield 中禁用“粘贴”

    我有一个用 Swing awt 编写的应用程序 我想阻止用户将值粘贴到文本字段中 有没有办法在不使用动作监听器的情况下做到这一点 您可以使用 null 参数调用 setTransferHandler 如下所示 textComponent s
  • 如何作为应用程序发布到页面?

    所以 我有一个应用程序 Facebook 应用程序实体 并且我有一个页面 我想使用应用程序通过java代码 通过restfb或任何其他建议 发布到页面 看起来我错过了页面授予应用程序发布权限的阶段 不知道该怎么做 谢谢你们 乌里 您只能 作
  • 从 Spring MVC XML 文件转移到 javaconfig。我真的对我的数据库 XML 文件感到困惑

    我从 Spring MVC XML 文件转移到 javaconfig 我真的对我的数据库 XML 文件感到困惑 我不知道如何让 Hibernate4 工作以及我的 JBoss JNDI 数据源工作 有人可以告诉我如何使 javaconfig
  • Spring中的ProxyFactoryBean

    有人可以解释一下吗代理工厂Bean http static springsource org spring docs current javadoc api org springframework aop framework ProxyFa
  • JUnit5 平台启动器 API - 如果没有至少一个测试引擎,则无法创建启动器

    我正在尝试升级我们的自动化测试套件的测试能力以接受 JUnit5 测试并遵循JUnit 平台启动器 API 说明 https junit org junit5 docs current user guide launcher api我收到错
  • 这个等待通知线程语义的真正目的是什么?

    我刚刚遇到一些代码 它使用等待通知构造通过其其他成员方法与类中定义的线程进行通信 有趣的是 获取锁后 同步范围内的所有线程都会在同一锁上进行定时等待 请参见下面的代码片段 随后 在非同步作用域中 线程执行其关键函数 即 做一些有用的事情1
  • Java:SortedMap、TreeMap、可比较?如何使用?

    我有一个对象列表 需要根据其中一个字段的属性进行排序 我听说 SortedMap 和 Comparator 是实现此目的的最佳方法 我是否要与正在排序的类实现 Comparable 还是创建一个新类 如何实例化 SortedMap 并传入
  • Struts 1 到 Spring 迁移 - 策略

    我有一个legacy银行应用程序编码为Struts 1 JSP现在的要求是迁移后端 目前为 MVC to Springboot MVC 后续UI JSP 将迁移到angular Caveats 1 后端不是无状态的 2 会话对象中存储了大量
  • 纱线上的火花,连接到资源管理器 /0.0.0.0:8032

    我正在我的开发机器 Mac 上编写 Spark 程序 hadoop的版本是2 6 spark的版本是1 6 2 hadoop集群有3个节点 当然都在linux机器上 我在idea IDE中以spark独立模式运行spark程序 它运行成功
  • 在 Java 中创建 XML 文件的最佳方法是什么?

    我们目前使用 dom4j 来创建 XML 文件 不过 我猜现在有更好的东西了 如果我们使用的是 Java 1 6 或更高版本 那么在编写 XML 文件时最好使用什么类 运行速度最快 使用简单 我不需要构建一个 DOM 然后编写整个 DOM
  • 为什么无法从 WEB-INF 文件夹内加载 POSModel 文件?

    我在我的 Web 项目中使用 Spring MVC 我将模型文件放在 WEB INF 目录中 String taggerModelPath WEB INF lib en pos maxent bin String chunkerModelP
  • 如何从intellij项目视图中隐藏不必要的文件?

    给定一个示例 gradle 项目 其项目结构如下所示 正如你所看到的 有很多东西你实际上不需要在想法中看到 但你需要它们存在 我知道下面被忽略的文件 文件夹类型Editor File Types但这些正在影响库和项目 idea 会在各处忽略
  • javax.media.jai 类的公共下载?

    这是一个非常简单的问题 我一直在寻找可以下载 javax media jai 库的地方 我找到了 jai imageio 库 但是我发现的所有其他 jai 内容要么已经过时 2008 年及之前 然后我遇到了登录屏幕 是否有 javax me
  • 让 Hibernate 和 SQL Server 与 VARCHAR 和 NVARCHAR 良好配合

    我目前正在大型数据库的某些表中启用 UTF 8 字符 这些表已经是 MS SQL 类型 NVARCHAR 此外 我还有几个使用 VARCHAR 的字段 Hibernate 与 JDBC 驱动程序的交互存在一个众所周知的问题 例如 参见在 h
  • Axis2 错误:要输出的文本中的空白字符 (0x4) 无效

    我创建了一个 Java 客户端 使用 Axis2 1 7 6 作为代码生成器与 SOAP Web 服务进行交互 问题在于客户端的某些输入抛出异常并显示以下消息 org apache axis2 AxisFault Invalid white
  • spring data jpa复合键重复键记录插入导致更新

    我有一个具有复合键的实体 我试图通过使用 spring data jpa 存储库到 mysql 数据库来持久化它 如下所示 Embeddable public class MobileVerificationKey implements S
  • 决策树和规则引擎 (Drools)

    In the application that I m working on right now I need to periodically check eligibility of tens of thousands of object

随机推荐

  • 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