На самом деле, кусок кода, который создает экземпляр только 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");
}
}
сейчас если вы это сделаете:
Enemy enemy = new Ogre();
enemy.Test();
Консоль будет печатать «огр», а не «враг».
лучше использовать интерфейс 'IEnemy', а не базовый класс Enemy'. Если вы не создадите новых врагов в качестве базового класса, интерфейс будет более подходящим. – wudzik
. Между этими творениями не так много различий, кроме нового объекта с точностью до Enemy, будет предоставляться только интерфейс базового класса. – Mykola
Вы * не * создаете их по-разному. Вы делаете что-то другое с объектами, которые вы создаете одинаково (а именно, сохраняете их по-другому). – Servy