将基类引用复制到子类时是否存在问题? (向下转换)

时间:2017-02-09 18:20:18

标签: c# oop

我有List<Character> citizens。 公民有各种财产,最重要的是:

public string firstname;
public Dictionary<Character, Relationship> relationships { get; set; }
...

公民可以在创建后成为,例如Trader : Character
因此,在我的公民名单中,我想将一个字符的引用替换为一个交易者。

我阅读并理解有关向下转换的答案。所以我将做构造函数方法:

public Trader(Character c)
{
    firstname = c.firstname;
    relationships = c.relationships;
    ...         
}

然后我想替换旧角色的引用并使用这个花哨的新交易者:

citizens.Remove(old);
citizens.Add(fancyTrader);

我关心的是对关系字典的引用,这不仅会导致旧Character对象永远挂起,这意味着这个人在内存中有两个副本,旧的永远不会被垃圾收集远?

我很担心,因为我有成千上万的这些公民。

2 个答案:

答案 0 :(得分:2)

解决此问题的一种方法是使用组合代替继承。考虑将您的Character信息抽象为多个部分。 Character类保存名称数据和关系,而Role类保存他们的&#34;作业&#34;。 Trader将是Role的子类,而Character将为该公民的角色拥有一个属性(如果他们可以拥有多个角色,甚至可以包含一个角色列表

这为您提供了很大的灵活性,并且还可以防止您的引用在角色更改角色时变得混乱。

答案 1 :(得分:0)

是的,你可能在这种情况下会出现内存泄漏,但是如果你完全小心自己清理后你会没事(这与转发无关)。

向下转换的主要“陷阱”是尝试对付实际上并不是你要投射到的类型,这是一个运行时错误(不理想)。使用您的方法,您需要确保您了解您正在执行副本以及可能引发的错误。

我会使用分析器运行程序一段时间,确保您没有越来越多的引用并使用它来查看是否有问题。在Citizen上使用“Dispose”方法可以在不再需要该对象时清理关系字典,这将大大有助于解决任何此类问题。