【问题标题】:Casting a interface derived class to another derived class将接口派生类转换为另一个派生类
【发布时间】:2012-07-26 21:36:19
【问题描述】:

我正在尝试完成一种方法,将从接口派生的给定对象转换为也从同一接口派生的不同类型。这是为了避免必须完全重建对象。

interface IItem
{
}

class FryingPan : IItem
{
}

class CookingPan : IItem
{
}

但这里有一个问题,我不“知道”我要投射到什么类型。我只知道类型变量。这是从组合框设置的。

Type SelectedItem { get; set; }

这可以做到吗(最好不用实现IConvertable

【问题讨论】:

  • 如果您在编译时不知道类型,您希望通过强制转换达到什么目的?
  • 通俗的说;排序。所有项目都存储在一个列表中,每个项目将被放置、显示和交互,但彼此之间略有不同,但基本上都是一样的。该项目可以或应该在其他类型之间互换
  • 我认为您应该描述您想要实现的目标,以便我们可以为您提供另一种观点,而不是您现在看到的问题,这似乎有点“扭曲”
  • @Nensec:听起来他们两个都应该实现IComparable<IItem>,此时不需要强制转换。

标签: c# casting


【解决方案1】:

如果您尝试将 CookingPan 转换为 FryingPan,则无法完成。一个必须从另一个派生才能铸造。想象一下;

interface IFruit
{ }

class Apple : IFruit
{ }

class Orange : IFruit
{ }

显然,苹果永远不可能是橙子,反之亦然。但是,您可以将 Apple 或 Orange 投射到 IFruit,因为它们都有共同的祖先。或者,如果您是一位疯狂的科学家,也许您可​​以以某种方式苹果变成橙子。 ;-)

我会说你以错误的方式处理你的问题。如果您需要根据 IItem 的 .Type 对其执行某些特定操作,那么您已经拥有该信息。如果您需要一些通用的排序标准,请考虑将其移至基类/接口,作为所有派生类型的共同祖先。

【讨论】:

  • 如果你有 IPerson - 一个人和两个类 Employee:IPeople 和 NotEmployee:IPeople 的接口,并且想要将一个人从雇员转换为非雇员怎么办?
  • 只要您只想通过 IPeople 接口与对象交互,具体类型是什么并不重要(运行时行为除外)