分配抽象基类
本文关键字:基类 抽象 分配 | 更新日期: 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
正如评论中所指出的,我建议您详细查看多态性。