Mik*_*ail 0 .net c# generics class visual-studio-2010
在下面的代码中,输出是;
厄尼伯特埃尔莫
为什么最后的输出是Elmo?不应该是厄尼吗?因为我实例化dog.Creature对象new Cat();.我认为,Name财产Cat类覆盖Name财产Creature类.
class Class1
{
public static void Main(string[] args)
{
var dog = new Dog();
var cat = new Cat();
dog.Creature = new Cat();
Console.WriteLine(cat.Name); //outputs Ernie
Console.WriteLine(dog.Name); //outputs Bert
Console.WriteLine(dog.Creature.Name); //outputs Elmo, why not Ernie?
Console.Read();
}
}
public class Animal<T> where T : Creature
{
public T Creature { get; set; }
private string _name = "Oscar";
public string Name { get { return _name; } set { _name = value; } }
}
public class Creature
{
private string _name = "Elmo";
public string Name { get { return _name; } set { _name = value; } }
}
public class Cat : Creature
{
private string _name = "Ernie";
public string Name { get { return _name; } set { _name = value; } }
}
public class Dog : Animal<Creature>
{
private string _name = "Bert";
public string Name { get { return _name; } set { _name = value; } }
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 15
首先,这与泛型无关.如果你写下你会得到完全相同的行为:
Creature cat = new Cat();
Console.WriteLine(cat.Name);
Run Code Online (Sandbox Code Playgroud)
不要忘记编译时类型Dog.Creature是Creature.
我认为Cat类的Name属性会覆盖Creature类的Name属性.
不,因为它不是虚拟财产而您还没有使用过override.您应该有一个编译时警告,明确表示您正在隐藏该成员,而不是覆盖它:
Test.cs(30,19): warning CS0108: 'Cat.Name' hides inherited member
'Creature.Name'. Use the new keyword if hiding was intended.
Run Code Online (Sandbox Code Playgroud)
如果你改变Cat并且Creature像这样,它将起作用:
public class Creature
{
private string _name = "Elmo";
public virtual string Name { get { return _name; } set { _name = value; } }
}
public class Cat : Creature
{
private string _name = "Ernie";
public override string Name { get { return _name; } set { _name = value; } }
}
Run Code Online (Sandbox Code Playgroud)
......但我个人试图避免这种情况.为什么不直接使用setter Creature?你为什么要_name在Cat对象中有两个字段?这不是说它们意味着服务于不同的目的,是吗?
目前还不清楚你想要实现什么,但我几乎肯定会给这个Creature类一个构造函数,并将该名称作为参数.如果可能的话,我可能会将该属性设为只读.
| 归档时间: |
|
| 查看次数: |
264 次 |
| 最近记录: |