C#转换和继承

时间:2011-08-31 17:18:12

标签: c# inheritance casting

我有一个对象,我经常传递。

我需要向其添加一段数据,而不能修改基类

所以我有

static OriginalThing GetNewThing()
{
  return new OriginalThing();
}

现在我要添加我的数据

class EnhancedThing : OriginalThing
{
  string name;
  static EnhancedThing GetNewThing(string name)
  {
     EnhancedThing ething = new OriginalThing();   <---doesnt work even if i cast it
     ething.Name = name;
  }
}

我该怎么做?

4 个答案:

答案 0 :(得分:3)

您无法将OriginalThing分配给NewThing,因为它只是而不是 NewThing。另一种方法可以正常工作,因为NewThing能够满足OriginalThing所有的一切,但反之则不然。

只需创建EnhancedThing的实例,指定名称,然后将其返回。您可以将EnhancedThing视为OriginalThing,因为 OriginalThing

class EnhancedThing : OriginalThing
{
  public string Name { get; private set; }
  static EnhancedThing GetNewThing(string name)
  {
     EnhanedThing thing = new EnhancedThing();
     thing.Name = name;
     return thing;
  }
}

// ...

OriginalThing foo = EnhancedThing.GetNewThing( "someName" );

同时意识到,由于name当前是私有成员变量(在您的示例中),并且您将无法访问NewThing对象的任何其他功能,因此不会为您带来太多的购买,除非您将它们视为NewThing s(与OriginalThings相对,但如果需要,您可以将它们作为OriginalThing传递)

答案 1 :(得分:1)

你需要这样做:

EnhancedThing ething = new EnhancedThing();

答案 2 :(得分:0)

这是因为OriginalThing不是EnhancedThing,而是EnhancedThing是OriginalThing。

您可以做的一件事是使用EnhancedThing的构造函数,该构造函数接受OriginalThing并复制适用的成员。

class EnhancedThing : OriginalThing
{
    public EnhancedThing()
    {
        // default constructor
    }

    public EnhancedThing( OriginalThing src )
    {
        // copy over the significant items
    }
}

答案 3 :(得分:0)

如果另一个类是密封的,您可以在新类中使用封装,然后修改/扩展API。然后,您可以定义从一个对象到另一个对象的隐式强制转换,并可以交替使用这些类型而不强制转换

这是否适用于您的情况取决于您打算做什么,以及您想要实现的目标,但这是一项有价值的技术。隐藏原始部分的所有成员并重新定义API更有用。

// no need to cast
EnhancedThing thing = new OriginalThing();
var result = thing.NewMethod();

// again no need to cast, treat as original when passing around
OriginalThing original = thing;

public class EnhancedThing
{
    private readonly OriginalThing originalThing;

    public static implicit operator OriginalThing(EnhancedThing enhancedThing)
    {
        return enhancedThing.originalThing;
    }

    public static implicit operator EnhancedThing(OriginalThing originalThing)
    {
        return new EnhancedThing(originalThing);
    }

    private EnhancedThing(OriginalThing originalThing)
    {
        this.originalThing = originalThing;
    }

    public string OriginalMethod()
    {
        return originalThing.OriginalMethod();
    }

    public string NewMethod()
    {
        var value = originalThing.OriginalMethod();
        // extra processing ...
        return value;
    }
}

此技术在Sitecore中广泛使用,以提供来自公共基础实现的不同数据类型模型。如果您打算添加新数据字段,则会有一个警告,它将在向上播放时丢失。