В: «В чем разница между использованием Dog в качестве ссылки и BullDog в качестве ссылки?»
A: Если у вас есть ссылка на Dog, любые дополнительные методы / свойства / поля, которые вы добавляете в производный тип BullDog, не будут общедоступными.
например. если у вас было:
public class Dog
{
public virtual void Bark()
{
Console.WriteLine("Woof");
}
}
public class BullDog : Dog
{
public override void Bark()
{
Console.WriteLine("BOWF!");
}
public void Slobber()
{
Console.WriteLine("I cannot control my drool :(");
}
{
... вы не сможете сделать это:
Dog baseDog = new BullDog();
baseDog.Slobber(); // error -- Dog doesn't know how to slobber.
... поскольку метод не существует для базового типа.
Кроме того, в зависимости от того, есть ли у вас базовая / производная ссылка, могут также возникнуть некоторые тонкие проблемы, которые могут возникнуть при небрежном использовании оператора new. Однако, по моему опыту, это очень редкие случаи (см. Пост Вутера де Корта, поскольку он только что опубликовал лучшее объяснение, когда я его печатал).
В: "У меня есть привычка использовать var dog3 = new BullDog (); это похоже на BullDog dog2 = new BullDog (); Когда нам нужно использовать Dog dog2 = new BullDog () ;?"
A: Вы можете даже не знать, какой тип Dog
вы получаете, все, что вы знаете ... это Dog
. Считай ...
public static class DogFactory
{
public static Dog CreateMysteryDog()
{
return new Shitzu();
}
}
Dog dog = DogFactory.CreateMysteryDog(); // what is the concrete type of Dog?
DogFactory возвращает ссылку Dog
, а не ссылку Shitzu
, поэтому вы должны использовать базовый тип. В этом случае переменная тоже будет Dog
, а не Shitzu
.