假设我有一个名为Enemy的基类和一个名为Ogre的派生类。

这两种方式创建实例之间有什么区别:

Enemy newOgre = new Ogre();

Ogre newOgre = new Ogre();

最佳答案

实际上,创建实例的代码只是new Ogre()。等号左侧的内容与创建实例无关。

第一条语句只是将创建的实例分配给Enemy类型的变量。第二个是将其分配给Ogre类型的变量。

因此,您有两个类型不同的变量,它们指向类型相同的对象,即Ogre

变量(等号左侧左侧上的内容)仅确定您可以从该对象访问的内容。例如,如果Ogre类的方法不是从Enemy继承的,则使用Enemy变量将无法访问它。

请注意,该变量不会影响对象的行为。例如,如果Ogre覆盖Enemy中定义的方法,则该方法会执行不同的操作。使用Ogre类型的变量在Enemy实例上调用此方法将导致调用Ogre中的覆盖方法,而不是Enemy中的方法,

例如,考虑以下类:

public class Enemy
{
    public virtual void Test()
    {
        Console.WriteLine("enemy");
    }
}

public class Ogre: Enemy
{
    public override void Test()
    {
        Console.WriteLine("ogre");
    }
}

现在,如果您这样做:
Orge enemy = new Orge();
enemy.Test();

控制台将打印“食人魔”。

如果执行此操作:
Enemy enemy = new Ogre();
enemy.Test();

控制台仍将显示“orge”。

关于c# - 基类=新派生类。这是如何运作的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33131610/

10-11 11:39