-3

请参阅下面的代码(C#):

Control button = new Button(100, 200, "Click Me!"); 
Control textBlock = new TextBlock(20, 20, "Hello World!");

List<Control> controls = new List<Control>();
controls.Add(button); 
controls.Add(textBlock);

foreach (Control ctrl in controls)
{
ctrl.DrawMe(); //The objects will behave polymorphically, because they derive from 
//a shared base class.            
}

Control 是我自己创建的一个抽象类。如果我将声明中的 Control 更改为它们的等效派生类(如下所示),我将获得完全相同的功能。这是为什么?对抽象基类而不是派生类进行赋值有什么区别吗?

    Button button = new Button(100, 200, "Click Me!"); 
    TextBlock textBlock = new TextBlock(20, 20, "Hello World!");
4

2 回答 2

3

当您的Button类有一个名为 ie 的属性ButtonImage,但您的Control类没有时,您将无法在通过控件列表进行计算时访问它。但是,当您的对象保存为Control.

于 2013-09-09T18:08:09.713 回答
1

但是,究竟有什么区别,也就是说,如果有的话。

virtual and overridden好吧,当您调用方法时,这没有任何区别。

主要区别在于您何时影子方法。

让我们考虑以下内容

class Control
{
    public void DrawMe()
    { }
}

class Button
{
    public new void DrawMe()
    { }
}

class TextBlock
{
    public new void DrawMe()
    { }
}

foreach (Control ctrl in controls)
{
    ctrl.DrawMe();//this will always call Control's version of DrawMe
}

此代码调用DrawMe相应类的位置

Button button = new Button(100, 200, "Click Me!"); 
TextBlock textBlock = new TextBlock(20, 20, "Hello World!");
button.DrawMe();//calls button's drawme and textblock will calls its version

正如评论中所指出的,我建议您详细了解多态性

于 2013-09-09T18:21:21.157 回答