我有一个winforms基础,它包含对需要在派生表单中实现的某些方法的调用。我想确保我的派生表单确实实现了那些尽可能多的编译时支持的方法。如果您希望能够使用设计器,我们都知道无法将winforms类定义为抽象的问题(请参阅this question)。
我创建了一个接口,其中包含需要在派生表单中实现的方法签名。然后我直接从基类调用接口方法,如:
((IMyFormInterface)this).SomeInterfaceMethod();
(请注意,我的基类不会继承IMyFormInterface
。如果确实如此,那么派生类就不会被强制实现它。)
然后我从派生形式的接口继承(编译器强制我实现):
public partial class TestForm : BaseForm, IMyFormInterface
我(或其他用户)唯一需要记住的是继承IMyFormInterface
。
直接调用这样的接口方法是否可以接受?我所有这一切的目标是能够尽可能地确保派生表单在编译时实现这些“抽象”表单方法,而不是运行时。
答案 0 :(得分:4)
这是解决设计师限制的一种方法。另一种方法是使用设计器构建一个UserControl
,然后让你的表单基类是抽象的,并实例化停靠在完整客户区的控件。
如果您使用这种方法,我会在构造函数中断言(this is IMyFormInterface)
以尽早捕获该错误。
答案 1 :(得分:0)
基本控件遇到了同样的问题
因为Designer不喜欢抽象基本控件类,所以我将抽象方法重构为抛出NotImplementedException的虚方法。
我不知道哪种方式最好。