Visual Studio: 设计一个继承自抽象基类的UserControl类

3
我希望为我的一些自定义UserControl创建一个抽象基类,与之相关的原因很明显:它们共享一些常见的属性和方法(实际上是接口的一些基本实现),我只想实现一次。 我通过定义我的抽象基类来实现这个目标:
public abstract class ViewBase : UserControl, ISomeInterface

接着,我像往常一样和设计师一起实现了一个视图:

public partial class SpecialView : UserControl //all OK

到这里一切都很好。现在我将我的SpecialView类的派生替换为抽象基类:

public partial class SpecialView : ViewBase //disrupts the designer

现在,在Visual Studio 2008中的设计师已经无法工作了,提示:The designer must create an instance of type 'ViewBase' but it cannot because the type is declared as abstract. 我该怎么解决?我不想为所有这些视图复制相同的代码。提示信息:有一个使用虚方法的问题,而不是抽象类,但对我来说没有合适的解决方案。
4个回答

2

不必使用抽象类,可以将函数标记为虚函数,并在继承类中重写它们。


其实,我不想覆盖,我想要一个可以继承的实现。在基类中能否有一个带有实现的虚方法? - Marcel
@Moe 我能在基类中有一个带实现的虚方法吗?虚方法可以有实现,可以被重写。如果没有抽象/虚方法,为什么要选择抽象基类?在这种情况下使用非抽象基类就可以了。唯一失去的是你可以在此情况下创建基类的实例;使用抽象基类将无法这样做。 - MPavlak

1

0
尝试一下Urban Potato提供的解决方案,这个方案对我很有效,但是有一个奇怪的副作用,我从来没有得到过一个好的解决方法。也许你会很幸运,不会遇到那个副作用!

0
有人可能会认为,在设计哲学上,期望能够在设计器中使用抽象控件是没有意义的。抽象类往往模拟一种对象类型,仅知道它是“X”并不能充分描述它——不存在抽象的鸟或汽车,它总是一种特定类型的鸟或汽车。从这个角度来看,如果你想在设计器中查看自定义控件,它必须是一种特定类型的控件,而不是抽象的控件,否则你在看什么?我可以理解为什么这很烦人,但我也可以理解为什么设计器是以这种方式编码的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接