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;
}
}
我该怎么做?
您不能将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中广泛使用,以提供来自公共基础实现的不同数据类型模型。需要注意的是,如果您打算添加一个新的数据字段,它将在向上转换时丢失。