窗体继承的问题

chenwg1991 2016-12-01 03:12:15
新建一个WinForm应用程序,修改主窗体为MainForm,再添加两个窗体Form1和Form2,我想用Form1继承Form2,但是可以继承MainForm,好像不可以,难道是只有主窗体才能作为父窗体吗???
还有窗体继承后,假如主窗体上有个button1,它有个Click事件,那么子窗体可以修改button1_Click事件中的内容吗,就想方法重写一样?
...全文
181 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
假设你想
Form2:Form1, MainForm
那么.net 并不支持多重继承,所以只能“委屈求全”转而设计一个接口来让 MainForm 和 Form2都使用这个接口,然后 MainForm和Form2都再来实现相关可执行代码来实现这个接口,Form2中的代码委派地使用到 MainForm 的一些内容。不支持多重继承就不能很好地使用继承技术,但是 .net(以及java)确实并不支持多重继承。 此时,仍然是,Form2必须“就是(is a)”MainForm才应该是用继承。而按照一般的理解,你的Form2窗口肯定不是一个导航窗口,所以它十有八九根本在此就不应该使用继承来设计。
  • 打赏
  • 举报
回复
你如果暂时想不明白如何使用继承机制来设计,那就先不要滥用继承。保持对继承概念的正确理解,等你悟到了一些“自然而然的”继承设计(实际上满大街都是)的时候再使用继承。 通常,父类跟子类之间,是一种概念传递关系,而不是什么”父亲与儿子“的关系。有些人胡说什么”父亲的财产被儿子继承,这就是继承“这显然是错误的。如果在软件上设计为:儿子继承了父亲,那么也就意味着一个儿子也就是他自己的爸爸,他娶了自己的妈妈并且生了自己,这显然是”不自然地“、滥用继承概念的。 所以“继承”是个设计术语,不要靠匹配字眼儿(是否相近)来理解概念,要深入设计机制去理解。懂得何时使用它。
  • 打赏
  • 举报
回复
引用 2 楼 chenwg1991 的回复:
[quote=引用 1 楼 dongxinxi 的回复:] Form1:MainForm Form2:Form1就行了 但是一般父类相对单一,面向对象的共性,多看看设计相关的多写写就知道了
这样的话,主窗口不能随意设计了不能到达目的啊[/quote] 继承不是为了“少写几行代码”的目的的,你学习的面向对象技术完全是错误的。继承的原则就是:子类对象必须能通过父类对象的业务场景的测试,子类对象必须“是”父类对象。比如说你说“汽车 is a 机器”这就是真正的继承,如果你说“汽车 is a 飞机”那么就是错误的继承,你不能为了少设计一个轮子于是就滥用继承去把汽车作为飞机,这样滥用就会产生一大堆诡异的、混乱的丑八怪设计出来。 所以,你这里说的“主窗口能随意设计”纯粹是一个错误的想法,是不理解继承的想法。
chenwg1991 2016-12-02
  • 打赏
  • 举报
回复
引用 11 楼 hanjun0612 的回复:
并且,sp说的是正确的。 C#只支持单继承。 而form1和form2作为Form的派生类。他们并没有继承关系。如果只是为了少些一些代码。 那就是错误的理解了继承关系。
有道理啊,声明成静态方法,直接用类名调用方法,谢谢提醒啊,我确实是没有理解好继承关系。
正怒月神 2016-12-02
  • 打赏
  • 举报
回复
并且,sp说的是正确的。 C#只支持单继承。 而form1和form2作为Form的派生类。他们并没有继承关系。如果只是为了少些一些代码。 那就是错误的理解了继承关系。
正怒月神 2016-12-02
  • 打赏
  • 举报
回复
如果你不想实例化 SharedFunction 可以把方法作为static
chenwg1991 2016-12-02
  • 打赏
  • 举报
回复
引用 6 楼 sp1234 的回复:
[quote=引用 2 楼 chenwg1991 的回复:] [quote=引用 1 楼 dongxinxi 的回复:] Form1:MainForm Form2:Form1就行了 但是一般父类相对单一,面向对象的共性,多看看设计相关的多写写就知道了
这样的话,主窗口不能随意设计了不能到达目的啊[/quote] 继承不是为了“少写几行代码”的目的的,你学习的面向对象技术完全是错误的。继承的原则就是:子类对象必须能通过父类对象的业务场景的测试,子类对象必须“是”父类对象。比如说你说“汽车 is a 机器”这就是真正的继承,如果你说“汽车 is a 飞机”那么就是错误的继承,你不能为了少设计一个轮子于是就滥用继承去把汽车作为飞机,这样滥用就会产生一大堆诡异的、混乱的丑八怪设计出来。 所以,你这里说的“主窗口能随意设计”纯粹是一个错误的想法,是不理解继承的想法。[/quote] 您说的对,我还真是为了少写几行代码,才打算这么继承的;我是从VB6转过来的,第一次上手用C#编个自己的小程序,正在实践学习。 我编的是计算软件,其实用Excel很方便就能实现,主要是为了实践。 所以,我本来的想法是,把通用的计算公式,放在一个类里边,叫做SharedFunction.cs。然后我计算不同的场合,需要用到公式,都写到SharedFunction.cs里面。 然后在窗体Form1里计算时,调用SharedFunction里面的函数,Form2计算,也调用SharedFunction里面的函数。 如果是VB6的话,函数放在模块里面,就可以直接使用模块里边的函数。 但是C#,我目前做法是,在每个窗体中,先将SharedFunction实例化,再调用它里边的函数方法,这样也能实现的我的母的。 然后才突发奇想,把函数全部写到一个窗体中,让它做父类,然后继承出的窗体都可以直接调用里面的函数,就是为了方便点。 用接口不适合我,因为方法都是一模一样的,要是在每个继承接口的类中,都写下一下方法太不合理了。 谢谢您的指正
threenewbee 2016-12-01
  • 打赏
  • 举报
回复
可以继承。可以修改。你遇到什么错误提示
秋的红果实 2016-12-01
  • 打赏
  • 举报
回复
事件中的内容,是什么意思? 估计是说事件触发后调用的方法吧,方法可以改,就是你说的重写override,父窗体用virtual修饰
szjay 2016-12-01
  • 打赏
  • 举报
回复
C#的类不支持多继承,如果要达到多继承的目的,建议用接口实现。 把方法改为virtual,派生类使用override就可以修改基类的方法了。 这两点都是最基本的OOP概念,建议楼主先理解封装、继承、多态。
chenwg1991 2016-12-01
  • 打赏
  • 举报
回复
引用 1 楼 dongxinxi 的回复:
Form1:MainForm Form2:Form1就行了 但是一般父类相对单一,面向对象的共性,多看看设计相关的多写写就知道了
这样的话,主窗口不能随意设计了不能到达目的啊
  • 打赏
  • 举报
回复
Form1:MainForm Form2:Form1就行了 但是一般父类相对单一,面向对象的共性,多看看设计相关的多写写就知道了

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧