我将对象放在一起是为了让一个对象将自己暴露为可以由另一个相同类型的对象转换的东西。沿着合并的方向思考,但操作不是通用的/直接的,因此您可以使用反射来简单地获取所有属性并执行一些预先确定的操作集。因此,我决定尝试将其实现为将自身公开为 Transformable 的对象,并为其附加一个知道如何执行转换(可以互换)的对象。我到目前为止的可编译代码是:
public interface ITransformer<TType> where TType : class
{
void Transform(TType source, TType destination);
}
public interface ITransformable<TType> where TType : class
{
bool Locked { get; set; }
ITransformer<TType> Transformer { get; set; }
void TransformFrom(TType source);
}
public class MyTransformer : ITransformer<MyTransformable>
{
public void Transform(MyTransformable source, MyTransformable destination)
{
// Perform some logic for the transform
}
}
public class MyTransformable : ITransformable<MyTransformable>
{
public bool Locked { get; set; }
public ITransformer<MyTransformable> Transformer { get; set; }
public string Value1 { get; set; }
public uint Value2 { get; set; }
public bool Value3 { get; set; }
public void TransformFrom(MyTransformable source)
{
Transformer.Transform(source, this);
}
}
如您所见,MyTransformable 类型包含一些数据(Value1 - Value3)以及一个Locked 状态和Transformer 对象将知道如何执行此项目的转换(泛型确保只允许使用能够作用于 MyTransformer 类型的转换器)。
我的问题是我不希望所有类型为 Transformable 的新对象都必须重复调用
public void TransformFrom(MyTransformable source)
{
Transformer.Transform(source, this);
}
所以我希望我可以将 MyTransformable 对象添加到
public abstract class Transformable<TType> : ITransformable<TType> where TType : class
{
public bool Locked { get; set; }
public ITransformer<TType> Transformer { get; set; }
public void TransformFrom(TType source)
{
Transformer.Transform(source, this); // ERROR! this is type Transformable<TType> not TType
}
}
public class MyTransformable : Transformable<MyTransformable>
{
}
但是由于我强调的错误,这当然不会编译。我觉得我错过了沿线某处的要点。谁能指出我正确的方向?
您需要做的是为派生类型添加一个 Hook ,以公开最终的、真正的 TType
实现(或简称为 this
)。这最好通过抽象属性来完成。
public abstract class Transformable<TType> : ITransformable<TType>
{
public bool Locked { get; set; }
public ITransformer<TType> Transformer { get; set; }
protected abstract TType Value { get; }
public void TransformFrom(TType source)
{
Transformer.Transform(source, Value);
}
}
public class MyOtherTransformable : Transformable<MyTransformable>
{
protected override MyTransformable Value
{
get { return this; }
}
}
我是一名优秀的程序员,十分优秀!