假设我有:
public class Animal
{
virtual public void Attack() {};
}
public class Lion : Animal
{
public override void Attack() { base.Attack(); }
}
public class Boar : Animal
{
public override void Attack() { base.Attack(); }
}
Run Code Online (Sandbox Code Playgroud)
以及这两种动物的容器:
Dictionary<int, Lion> lions;
Dictionary<int, Boar> boars;
Run Code Online (Sandbox Code Playgroud)
有没有办法投射“狮子”和“野猪”,以便我可以将它们传递给这样的函数?
void IterateTable(Dictionary<int, Animal> dictionary)
{
foreach(var entry in dictionary)
entry.Value.Attack();
}
Run Code Online (Sandbox Code Playgroud)
也许是这样的?
void IterateTable<T>(Dictionary<int, T> dictionary)
where T : Animal
{
foreach(var entry in dictionary)
entry.Value.Attack();
}
Run Code Online (Sandbox Code Playgroud)
您的代码按编写的方式工作。当字典值中的 Animal 调用了它的 Attack() 方法时,它会调用适当的、特定于动物的方法。这称为协方差。您可以为字典提供比其签名所需的更具体的类型。
您可以按如下方式修改您的代码以查看:
void Main()
{
Dictionary<int, Animal> dictionary = new Dictionary<int, Animal>()
{
[1] = new Lion(),
[2] = new Boar()
};
IterateTable(dictionary);
}
public class Animal
{
virtual public void Attack() { Console.WriteLine("Default animal attack"); }
}
public class Lion : Animal
{
public override void Attack() { Console.WriteLine("Lion attack"); }
}
public class Boar : Animal
{
public override void Attack() { Console.WriteLine("Boar attack"); }
}
void IterateTable(Dictionary<int, Animal> dictionary)
{
foreach (var entry in dictionary)
entry.Value.Attack();
}
Run Code Online (Sandbox Code Playgroud)
输出:
狮子攻击
野猪袭击
| 归档时间: |
|
| 查看次数: |
251 次 |
| 最近记录: |