基类 = 新的派生类.这是如何工作的
本文关键字:何工作 工作 派生 基类 | 更新日期: 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
调用方法,而使用其他变量可以调用这些方法。