c#类型转换和继承

本文关键字:继承 类型转换 | 更新日期: 2023-09-27 18:07:22

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

我需要向它添加一段数据,并且不能修改基类

所以我有

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;
  }
}

我该怎么做?

c#类型转换和继承

您不能将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 s传递)

您需要这样做:

EnhancedThing ething = new EnhancedThing();

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

你可以做的一件事是为EnhancedThing创建一个构造函数,它接受一个OriginalThing并复制应用的成员。

class EnhancedThing : OriginalThing
{
    public EnhancedThing()
    {
        // default constructor
    }
    public EnhancedThing( OriginalThing src )
    {
        // copy over the significant items
    }
}

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

这是否适合你的情况取决于你打算做什么,以及你想要实现什么,但这是一个有价值的技术。它对于隐藏原始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中广泛使用,以提供来自公共基础实现的不同数据类型模型。需要注意的是,如果您打算添加一个新的数据字段,它将在向上转换时丢失。