【问题标题】:Cannot Convert Derived Class to Base Class无法将派生类转换为基类
【发布时间】:2009-12-24 06:07:00
【问题描述】:

我正在解决交通问题,无法跨越这个障碍。我无法将派生类 StopsVisited 转换为其基类 Stops。基类 Stops 是 Stop 的集合。派生类 StopsVisited 是 StopVisited 的集合。

StopVisited 元素派生自 Stop(未显示定义)。

我有一个非泛型解决方法,我只是从 Stops 派生 StopsVisited,但泛型为我提供了更多的灵活性。我试图将其简化为最简单的形式。

基础

public abstract class Stops<T> where T : Stop 
{

}

派生

public class StopsVisited : Stops<StopVisited>
{

}

问题:

Stops<Stop> stops = new StopsVisited();

给我一​​个

错误 1 ​​无法将类型“StopsHeirarchy.StopsVisited”隐式转换为“StopsHeirarchy.Stops”

感谢任何帮助。

【问题讨论】:

标签: c# .net


【解决方案1】:

StopsVisited 不是Stops&lt;Stop&gt; 的子类型;它是Stops&lt;StopVisited&gt; 的子类型,完全不同。我同意 duffymo 的观点,即子类型化是解决问题的错误方法,但您所询问的特定功能在 C# 4 中称为“协方差”或“输出安全”;你可以阅读它here

【讨论】:

  • 协方差仅适用于接口,不适用于类。所以这里没有帮助
  • 我不会说“没用”。只是他必须按照设计使用该功能,而不是按照他写的问题。
【解决方案2】:

就个人而言,我不会使用继承来表示已访问过 Stop。我有一个布尔数据成员来表示已访问过一个停止。这似乎是一个二元属性——你要么被访问过,要么没有。

继承应该是关于不同的行为。除非您可以说已访问的 Stop 以某种方式表现不同,否则我建议不要在此设计中使用继承。

【讨论】:

  • 确实如此。继承在很多情况下被过度使用。
  • 这是提出简洁问题的问题。 StopVisited 有许多与 Stop 无关的属性(访问时的实际纬度/经度、VisitedOrder、实际 ServiceTime...)。
  • 我认为 VisitedOrder 应该是 Stops 聚合的属性,因为同一个 Stop 可能参与多个旅程。 ServiceTime 也是如此。无论您是否被访问过,纬度/经度都是固定的。仍然是一个糟糕的设计,应该重新考虑。
  • 不想在这里卷入一场激烈的战争,感谢所有帮助。但是纬度/经度绝对不一样。由于不正确的地图数据或驾驶员知识,客户可能在不同的位置得到了服务。事实上,我们使用这些数据来修正我们的地图。您必须向提问者承认问题领域并坚持技术方面。
  • 我不需要让步,就像你需要接受的一样。我只是一个提供意见的人,通常基于不完整的信息;接受或拒绝取决于您。放松——如果你愿意,你可以忽略我说的。
【解决方案3】:

C# 4.0 通过修改 CLR 来支持它解决了这个问题。

同时,拥有一个 Istops 接口(非泛型)并转换为它。

【讨论】:

  • 不——协方差仅适用于接口,不适用于类。
猜你喜欢
  • 1970-01-01
  • 2012-12-06
  • 2017-01-08
  • 2013-11-17
  • 2013-04-29
  • 2019-04-17
  • 2021-02-18
相关资源
最近更新 更多