分配抽象基类

本文关键字:基类 抽象 分配 | 更新日期: 2023-09-27 18:30:38

请参阅下面的代码(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 更改为它们的等效派生类(如下所示),我将获得完全相同的功能。为什么?将赋值分配给抽象基类而不是其派生类时有什么区别吗?

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

分配抽象基类

当你的Button类有一个属性叫做 ButtonImage ,但您的 Control 类没有,则在通过控件列表进行计数时将无法访问它。但是,您的对象在将其另存为Control时会有点"降级"(实际上不是)。

但是,究竟有什么区别,即如果有的话。

好吧,当您调用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

正如评论中所指出的,我建议您详细查看多态性。

相关文章: