使用基类和派生类实例化的区别
本文关键字:实例化 区别 派生 基类 | 更新日期: 2023-09-27 18:08:33
谁能给我解释一下通过基类引用实例化派生类和通过派生类名称本身实例化派生类的区别?
请把这个程序过一遍
using System;
abstract class Test
{
public int _a;
public abstract void A();
}
class Example1 : Test
{
public override void A()
{
Console.WriteLine("Example1.A");
base._a++;
}
}
class Example2 : Test
{
public override void A()
{
Console.WriteLine("Example2.A");
base._a--;
}
}
class Program
{
static void Main()
{
// Reference Example1 through Test type.
Test test1 = new Example1();
test1.A();
Example2 test2 = new Example2();
test2.A();
}
}
这里又是一个问题,在Main()方法中创建了两个对象。
第一个对象test1是通过Test(基类)类型引用的,它实际上是什么意思?与基于派生类的第二个对象相比,它有什么区别呢?
在首选的程序中,引用基类或派生类,它有什么帮助?
我知道我的问题有点模糊,但是任何关于这个的想法都会对我进一步学习很有帮助。Test test1 = new Example1();
当您使用基类类型新建派生类对象时,您正在使用多态性的概念。
在您的示例中,我们看不到使用多态性的优势,但是在其他一些情况下,应用多态性可以帮助我们编写简洁的代码。例如,当您需要不同派生类的许多对象调用它们的虚拟(或抽象)方法时,您可以创建一个基类列表,但将每个对象新建为不同的派生类,这样您就可以遍历列表并以简洁的方式调用方法。
用文字可能很难理解,但是你可以在本页的第一个示例代码中找到多态性的一般用法,我们可以将调用不同派生类的许多虚拟方法的代码压缩到只有一行(s.Draw();)。因此,在不应用多态性的情况下,我们只能分别新建多个对象并分别调用Draw()方法,在这种情况下,这显然不是一种好的编码方式。
在接近继承的使用和一般抽象时,我会考虑您需要从类中使用什么,然后使用其类型表示的最一般(抽象)版本来保存变量和方法签名(例如Example1)。
Test test1 = new Example1();
test1.A();
只要不违反SOLID原则,这将为您带来最小阻力的重构自由,确保您不会一眼就认为代码依赖于特定于派生类的任何辅助方法。
Example2给人的印象是代码完全依赖于该实现,这可能是合适的,但通常表示紧密耦合。
Example2 test2 = new Example2();
test2.A();
这是在设计/编译时而不是在运行时的区别。在运行时,它们都产生相同的结果,唯一的例外是使用反射。在等号右边发生的事情不受等号左边类型定义的影响。