【发布时间】:2017-01-30 06:40:02
【问题描述】:
给定以下代码:
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")
{
}
}
产生以下输出:
狗说:嗨,我是猫!
猫说:嗨,我是猫!
为什么?我希望狗会说“嗨,我是狗!”
有人可以 a) 向我解释这种行为并 b) 让我知道我应该如何更新我的代码吗?
真实的例子是我在具体类之间共享一个昂贵的属性。
【问题讨论】:
-
删除
static并改成protected。静态成员不可继承 -
这很有意义,因为静态字段实际上是类的成员,而不是类的实例。因此,作为对象的 Dog 和 Cat 将共享这些字段。