【发布时间】:2012-10-22 07:58:25
【问题描述】:
我想在称为(Form) 的自定义表单中跟踪TopMost 属性更改。我不能使用override,因为TopMost 不是abstract 或virtual,我不能使用new 关键字,因为它在隐式引用时不起作用。
处理此类任务的最佳方法是什么?我们可以替换任何属性而不是TopMost,只要基类 (Form) 既没有“更改”事件,也没有要覆盖的 ONSomething 虚拟方法,并且我们的属性没有标记为 abstract 或 virtual。
例子:
我有很多基于Form的课程
MyForm1:Form, class MyForm2:Form, class MyForm_n:Form
一些“工厂”返回Form 类型的实例
Form f = GetMyForm();
最后我做到了
f.TopMost = !f.TopMost;
问题是我不能真正为Form GetMyForm() 使用任何其他返回类型。除了实际的Form 一个之外,我不能使用interface 或其他基类(实际上没有工厂,我使用了一些控件的.ParentForm 属性)。
完成任务和保持代码尽可能干净的最佳方法是什么?提前致谢。
【问题讨论】:
-
您的示例代码似乎与您在第一段中描述的问题无关。您是否在问如何最好地通知没有适合该通知的事件的属性的更改?如果没有,你能澄清你的问题吗?
-
您能自己更改基类
Form的代码,以使属性虚拟化和/或在其setter 和getter 中插入额外的代码吗? -
@dan 抱歉,保存错误。一分钟内。
-
@DanPuzey 我认为你已经足够接近了。我在这里遇到了一些架构问题,所以我不知道我在寻找什么。我会尽量简短地说:我只需要处理基本 Form 和 UserControl 类的实例。表单包含用户控件。 UserControl 可以直接更改 .ParentForm .TopMost 属性。而且我需要双向连接:当第三方更改 Form (.ParentForm) .TopMost 属性的值时,我必须更新/通知 UserControl 实例。目标框架版本为 3.5。
-
@JeppeStigNielsen 不,只是基本的(我可以说“本机”吗?)表单类,因为我从 .ParentForm 属性中检索实例,并且无法真正重构以新返回引入新属性类型,或执行一些丑陋的类型转换,如 MyForm f = this.ParentForm as MyForm。我相信我在这里错过了一些简单的东西。
标签: c# overriding virtual abstract