gpt4 book ai didi

c# - 成员字段中的多态性,当字段是对象的集合时,这些对象也是继承树的一部分

转载 作者:行者123 更新时间:2023-12-02 04:50:01 24 4
gpt4 key购买 nike

我在表达问题时遇到困难,所以我将从一个例子开始:

public class BirdCollector
{
protected Dictionary<string, Bird> nameToBird_;

public BirdCollector(Dictionary<string, Bird> nameToBird)
{
nameToBird_ = nameToBird;
}
}

public class ExoticBirdCollector
{
public ExoticBirdCollector(Dictionary<string, Bird> nameToBird)
: base(nameToBird)
{ }

public ExoticBird GetExoticBird(string name)
{
Bird bird;
if(nameToBird_.TryGetValue(name, out bird))
{
return (ExoticBird)bird;
}
else
{
// handle error
return null;
}
}
}

我正在传递给 ExoticBirdCollector 的字典包含所有 ExoticBird , 它扩展了 Bird , 但我每次都必须在 GetExoticBird() 中重新转换它们.

是否可以将这些强制转换一次,也许在构造函数中,这样每次我从 nameToBird_ 得到一只鸟时,它都会是一个 ExoticBird ?编译器无法知道我传递了所有 ExoticBirds在 map 中,除了声明一个单独的字典之外,还有其他方法可以强制执行此操作,例如Dictionary<string, ExoticBird> nameToExoticBird_

我现在正在考虑做的(这似乎不正确)是在 BirdCollector 中创建 nameToBird_ private 而不是 protected,并将其隐藏在 ExoticBirdCollector 中字符串字典和 ExoticBird .

我原来的问题得到了回答,但我有一个相关的跟进。如果我需要 Dictionary<string, ExoticBird>被传递到接受 Dictionary<string, Bird> 的新类中在构造函数中,我该如何实现?我怀疑无法进行向下转换,因为对象在容器内。我可以创建一个新的 Dictionary<string, Bird>并循环遍历 Dictionary<string, ExoticBird>填充它然后传递它,但这似乎是一种 hack。

最佳答案

使您的基类通用并移动 GetBird 方法

public class BirdCollector<T> where T : Bird
{
readonly Dictionary<string, T> nameToBird_;

public BirdCollector(Dictionary<string, T> nameToBird)
{
nameToBird_ = nameToBird;
}

public T GetBird(string name)
{
T bird;

if (nameToBird_.TryGetValue(name, out bird))
{
return bird;
}

// handle error
return null;
}
}

然后你可以这样声明它的派生类

public class ExoticBirdCollector : BirdCollector<ExoticBird>
{
public ExoticBirdCollector(Dictionary<string, ExoticBird> nameToBird)
: base(nameToBird)
{
}
}

关于c# - 成员字段中的多态性,当字段是对象的集合时,这些对象也是继承树的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19032010/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com