使用Windows窗体作为抽象类 - 使用哪种模式?

Cal*_*nus 10 .net abstract-class abstract winforms

我正在努力解决我一次又一次出现的情况,但我不确定我做事的方式是错误的还是我可以用不同的方式做事.

一个例子:

我有一个Windows窗体,它有一个DataGridView,有一些私有方法来执行datagrid的验证,并解释datagridview上的鼠标右键等.这个窗体本质上是一个"抽象"类,永远不会直接实例化.

然后我从这个基类继承并以各种方式(模板模式)定制它,例如定义datagridview的列和特定于这些列的特定格式化方法等.

当我使用这些类时,基类公共方法构成了我的接口,我可以实例化我想要的特定类型的datagridview,并通过公共接口对其进行操作.可爱.

问题:

主要问题是,您实际上无法将Windows窗体类声明为抽象,而不会导致Visual Studio设计器因为无法实例化这些抽象类而导致抖动.

一些方案:

目前我正在"实现"我想要覆盖的基类中的那些方法:

    throw new NotSupportedException();
Run Code Online (Sandbox Code Playgroud)

所以至少如果我忘记覆盖形成我的界面的这些方法之一.这对我来说似乎很臭,我真的不喜欢它.

我玩弄的另一个解决方案是完全取消继承并定义一个接口(例如IMyDataGrid)并在每个datagridview类中实现它(一种策略模式).这里的问题是你失去了代码重用的好处,继承让你意味着你必须创建许多不同的表单,在它们上放一个数据网格视图 - 有效地复制和粘贴相同的代码到每一个.坏.

有没有更好的方法来实现这一目标?

Jon*_*gel 4

根据您的要求,有多种方法可以做到这一点。

  • 将表单内容放入实现接口的用户控件中以执行自定义逻辑
  • 派生类DataGridView实现接口来执行自定义逻辑
  • 如前所述,使用带有virtual方法的具体类而不是使用abstract
  • ...

您必须选择最适合您需求的选项。在不了解您提出问题的领域和具体情况的情况下,我认为我们无法给您 100% 确定的答案。