Учитывая следующий код:Почему этот статический экземпляр родителя делится между новыми экземплярами детей?
class Program
{
static void Main(string[] args)
{
var dog = new Dog();
var cat = new Cat();
dog.Print();
cat.Print();
Console.ReadKey();
}
}
public abstract class Animal
{
private static string _name;
protected Animal(string name)
{
_name = name;
}
private static string _hi;
private string SayHi()
{
return _hi ?? (_hi = $"Hi, i'm a {_name}!");
}
public void Print()
{
Console.WriteLine($"{this.GetType().Name} says: {SayHi()}");
}
}
public class Cat : Animal
{
public Cat() : base("Cat")
{
}
}
public class Dog : Animal
{
public Dog() : base("Dog")
{
}
}
Следующий вывод производится:
Собака говорит: Привет, я кот!
Cat говорит: Привет, я кот!
Почему? Я ожидал, что собака скажет: «Привет, я собака!»
Может кто-нибудь а) объяснить мне такое поведение и b) сообщить мне, как я должен обновлять свой код?
Настоящим примером является то, что я разделяю недвижимость между конкретными классами.
Удалить 'static' и сделать его« защищенным ». Статический член не наследуется – Fabio
Возможный дубликат [C# static member "inheritance" - почему это вообще существует?] (Http://stackoverflow.com/questions/2281775/c-sharp-static-member-inheritance-why-does -this-exist-at-all) –
Это имеет смысл, поскольку статические поля на самом деле являются членами класса, а не экземпляром класса. Следовательно, Dog и Cat, которые являются объектами, будут делиться этими полями. –