【问题标题】:How to deal with base non-virtual/non-abstract properties when need override and implicit class usage?当需要覆盖和隐式类使用时如何处理基本的非虚拟/非抽象属性?
【发布时间】:2012-10-22 07:58:25
【问题描述】:

我想在称为(Form) 的自定义表单中跟踪TopMost 属性更改。我不能使用override,因为TopMost 不是abstractvirtual,我不能使用new 关键字,因为它在隐式引用时不起作用。

处理此类任务的最佳方法是什么?我们可以替换任何属性而不是TopMost,只要基类 (Form) 既没有“更改”事件,也没有要覆盖的 ONSomething 虚拟方法,并且我们的属性没有标记为 abstractvirtual

例子:

我有很多基于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


【解决方案1】:

听起来您可能想在具体类和Form 之间引入一个新的抽象类。这可能有一个ObservedTopMost 属性或类似的东西,它委托给TopMost,但也会引发一个事件。

请务必注意,这在使用新属性时有用;它不会神奇地发现其他地方对现有属性的更改。不过,对于您的目的来说,它可能已经足够了。

【讨论】:

  • 不,不能。我相信我搞砸了 sn-ps,所以最好的问题陈述放在我的 cmets 到原始帖子中。很抱歉给您带来不便。
  • @JohnSmith:在这种情况下,答案是否定的——你不能影响从只知道你没有的类的类型调用的非虚拟成员的行为控制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
  • 2014-02-23
  • 2012-07-03
  • 1970-01-01
相关资源
最近更新 更多