我有一个对象,我经常传递。
我需要向其添加一段数据,而不能修改基类
所以我有
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;
}
}
我该怎么做?
答案 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中广泛使用,以提供来自公共基础实现的不同数据类型模型。如果您打算添加新数据字段,则会有一个警告,它将在向上播放时丢失。