强制派生类实现给定方法

时间:2016-11-08 16:02:01

标签: c++ winforms inheritance abstract

我有一个WinForms表单,它有多个TabControl选项卡。我通过向每个标签页添加用户控件来实现标签页的功能。这使我能够将功能分成每个页面的类,而不是面对巨大的Form类的问题。

此外,我已经定义了一个标签页基类,以提供常用功能和对应用程序参数的引用。因此继承是UserControl - > PagesBase - > MyPage1(MyPage2等)。如果PagesBase不是抽象的,这一切都很好。我可以在VS2012中正常设计各个页面。

但是,我想强制每个页面实现一组小(通用)方法和属性。首先想到的是使用抽象的PagesBase类。不幸的是,VS中的各个页面设计者无法启动,抱怨他们需要创建PagesBase的实例。

接下来的想法是将一个接口应用于PagesBase。但这并不起作用,因为它强制PagesBase定义所有常用方法等,然后它们可用于派生的MyPageN类,而无需定义自己的。接口不允许在基类中将它们定义为私有。

因此,期望任何人添加页面直接从公共接口派生(但不能强制执行此操作)或者如果页面调用基类方法而没有覆盖(没有编译时警告),则会引发运行时异常

我错过了一些明显的东西吗?有什么想法吗?

2 个答案:

答案 0 :(得分:0)

通常情况下,一个抽象的PagesBase类(具有纯虚函数)将是一个很好的方法,除了它似乎与表单设计器不兼容(注意我不知道设计师是如何工作的)。

你能做的就是把你的班级分成两部分:

  • 您的PagesBase类将是一个没有纯虚函数的具体类。
  • PagesBase将保存指向MyPageIntf的指针。
  • MyPageIntf将是一个定义页面界面的抽象类。
  • MyPage1,MyPage2等将从MyPageIntf派生。
  • 您将使用MyPageIntf接口在PagesBase中实现函数。
  • 如果设计者调用这些函数中的任何一个(使用MyPageIntf接口实现),那么为了防止nullptr崩溃,在PagesBase构造函数中,您需要将MyPageIntf指针设置为提供某种默认值的对象接口的实现。在运行应用程序时(而不是在设计器中运行),您将使用真实实现(即MyPage1 / MyPage2 /等)替换它。

答案 1 :(得分:0)

您是否尝试在PagesBase类中添加默认构造函数(无参数)?这可能是Designer为了呈现它所期望的。