计算器。我是C#的新手,但是有C ++经验,我坚持一个想法实现:
我想创建一个具有抽象属性(不是C#属性,但变量)作为基类的对象和具有这种继承的N个派生类:
ObjWithProps <-- A <-- B <-- N other classes derived one from another
属性列表是静态的,因此每个类型将初始化一次,而不是每个对象。 A和B中的每一个都可以添加具有唯一字符串表示名称的自己的抽象属性。首先,我想用 OpenInstanceDelegates 来制作它,但事实证明,代理不能协变,我是对的吗?
public delegate T OpenGetterDlg<T>(ObjWithProps instance);
我不能简单地将函数A.GetSomething()
绑定到OpenGetterDlg
,因为this
参数不同,协方差在这里不起作用。
我可以这样做:
public delegate TPropType OpenGetterDlg<TPropType, TThisType>(TThisTypeinstance);
但是当处理
列表时,它会变成真正的痛苦class CPropWrapper<TPropType, TInstType> where TInstType : ObjWithProps
{
// Property ID here
// Setter Delegate object here
// Getter Delegate object here
}
太多演员阵容,太多类型参数,太多模板......也许有人知道C#中的那个任务怎么办?关键思路:静态道具列表,任何派生类(A,B,C,D)都可以将自己的道具添加到列表,封装和最小类型规范中。
提前致谢!
UPD1: 伪代码
class ObjWithProps
{
class CPropertyWrapper
{
public string Name;
public OpenGetterDelegate Getter;
public OpenSetterDelegate Setter;
}
static List<CpropertyWrapper> AbstractProps;
public CProperty GetPropertyByName(string name)
{
// Find property by name and
return PropertyFromType(Getter());
}
}
CProperty是int,float,myType1,myType2等类型的基础包装类。
class A: ObjWithProps
{
int IQValue;
public int getIQ() { return IQValue; }
public void setIQ(int iq) { IQValue = iq; }
protected override registerProps()
{
// this one should be called only once
registerProperty<int>("IQ", "getIQ", "setIQ");
}
}
class B: A
{
myType1 X;
public myType1 getX() { return X; }
public void setX(myType1 x) { X= x; }
protected override registerProps()
{
base.registerProps();
registerProperty<myType1>("X", "getX", "setX");
}
}