2016-11-08 88 views
0

我有有多个标签的TabControl一个WinForms形式。我通过向每个标签页添加用户控件来实现标签页的功能。这使我能够将功能分为每个页面的类,而不是面对巨大Form类的问题。强制派生类实现一个给定的方法

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

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

下一个念头,就是一个接口适用于PagesBase。但是这不起作用,因为它会强制PagesBase定义所有常用方法等,并且它们随后可用于派生的MyPageN类,而不必定义它们自己的方法。接口不会让它们在基类中被定义为私有的。如果页面调用的基类方法没有被覆盖(没有编译时警告),那么期望任何人都可以添加一个页面直接从一个通用接口派生(但不能强制执行此操作)或引发运行时异常)。

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

+0

您是否尝试过纯虚拟方法? –

+1

您可以在PagesBase中将您的方法声明为virtual,并且在chile pages类中未覆盖方法的情况下,会在内部抛出异常以获取运行时异常。 –

+0

@ThomasMatthews:是的,他有:当他说“使用抽象的PagesBase类”时,他就是这么做的。问题在于Visual Studio GUI设计者想要创建一个“PagesBase”对象,而不能。 –

回答

0

通常情况下,一个抽象的PagesBase类(带有纯虚函数)将是一个很好的途径,除非它对表单设计器(注意我不知道设计器是如何工作的)看起来不太合适。

你可以做的是你的类分成两个部分:

  • 你PagesBase类将是没有纯虚函数的具体类。
  • PagesBase将持有指向MyPageIntf的指针。
  • MyPageIntf将是一个定义您的页面接口的抽象类。
  • MyPage1,MyPage2等将从MyPageIntf导出。
  • 您可以使用MyPageIntf接口在PagesBase中实现函数。
  • 如果设计师要求的任何函数(您实现并采用MyPageIntf接口),那么为了防止nullptr崩溃,在你PagesBase构造函数,你需要将MyPageIntf指针设置为提供某种默认的对象接口的实现。当运行应用程序(而不是在设计器中运行)时,您将用真实实现(即MyPage1/MyPage2 /等)替换它。
0

您是否尝试添加默认构造函数(无参数)到你的PagesBase类?这可能是设计师为了呈现而期待的。

相关问题