基类 = 新的派生类.这是如何工作的

本文关键字:何工作 工作 派生 基类 | 更新日期: 2023-09-27 18:17:47

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

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

Enemy newOgre = new Ogre();
Ogre newOgre = new Ogre();

基类 = 新的派生类.这是如何工作的

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

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

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

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

请注意,该变量不会影响对象的行为方式。例如,如果Ogre重写了 Enemy 中定义的方法,该方法执行不同的操作。使用类型 Enemy 的变量在 Ogre 实例上调用此方法将导致调用 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"。

除了Yacoub的答案之外,在这种情况下,敌人将不包含Ogre拥有的属性和方法。

public class Enemy
{
    public int Property1 { get; set; }
    public int Property2 { get; set; }
}
public class Ogre : Enemy
{
    public int Property3 { get; set; }
}

假设你在食人魔职业中继承了敌人。这意味着您的食人魔将有效地包含 3 个属性:1、2 和 3。

在您的示例中,您将Ogre分配给Enemy类型。敌人类型不包含"属性3",因此您将无法在Enemy投射对象中使用扩展类"Ogre"。

//This will work
Ogre newOgre = new Ogre();
int newInt = newOgre.Property3;
//This wont.
Enemy newOgre = new Ogre();
int newInt = newOgre.Property3;

一个声明一个类型为 Enemy变量并引用一个新的 Ogre 对象。 另一个声明 Ogre 类型的变量并引用新的 Ogre 对象。

一些差异(并非详尽列表(:

  • 不能对类型 Enemy 的变量调用非继承的Ogre方法。
  • Ogre中被覆盖的任何虚拟Enemy方法在对任一变量调用时都将使用Ogre's实现。

假设你的敌人类看起来像这样:

public class Enemy
{
    public void Attack() { }
    public void Move() { }
}

和你的食人魔类是这样的:

public class Ogre : Enemy
{
    public void OgreSmash() { }
}

使用 Enemy 变量,您只能访问Attack()Move(),而不能访问具有 Ogre 变量的OgreSmash(),您将可以访问基类和派生类的方法。

这里

Enemy newOgre = new Ogre();

例如,不能使用后来添加到类Ogre中且不在基类中的newOgre调用方法,而使用其他变量可以调用这些方法。