我正在研究懒惰对象作曲家
class Bitset
{
private List<bool> _data;
public Bitset(List<bool> vector)
{
_data = vector;
}
public virtual bool GetElement (int i)
{
return _data[i];
}
public Bitset(){}
}
class BitsetComposer:Bitset
{
readonly private Bitset _a,_b;
private Func<bool,bool,bool> _composer;
public BitsetComposer(Bitset a,Bitset b, Func<bool,bool,bool> composer)
{
this._a=a;
this._b=b;
this._composer=composer;
}
public override bool GetElement (int i)
{
return _composer(_a.GetElement(i),_b.GetElement(i));
}
public static BitsetComposer operator & (BitsetComposer a, BitsetComposer b)
{
return new BitsetComposer(a,b,BitsetComposer.And);
}
public static bool And(bool a,bool b){return a&b;}
}
这不好,因为,希望&amp;也可以采用基类
//replaced with
//public static BitsetComposer operator & (BitsetComposer a, BitsetComposer b)
public static BitsetComposer operator & (Bitset a, Bitset b)
{
return new BitsetComposer(a,b,BitsetComposer.And);
}
但我收到了错误:
错误CS0563:二元运算符的参数之一必须是包含类型
答案 0 :(得分:1)
如果预期两个操作数都是基类类型,则只需将operator
代码移动到基类。
用户定义的运算符声明始终至少需要其中一个 参数是包含的类或结构类型 操作员声明。因此,用户定义的操作员不可能拥有 与预定义操作符相同的签名。
class Bitset
{
private List<bool> _data;
public Bitset(List<bool> vector)
{
_data = vector;
}
public virtual bool GetElement (int i)
{
return _data[i];
}
public Bitset(){}
public static BitsetComposer operator &(Bitset a, Bitset b)
{
return new BitsetComposer(a, b, BitsetComposer.And);
}
}
答案 1 :(得分:0)
如错误所示,您需要确保您的某个参数属于BitSetComposer
类。
您无法执行(BitSet a, BitSet b)
的原因是因为没有对您的自定义类的引用。考虑这个例子:
var a = new BitSet();
var b = new BitSet();
var result = a&b;
在这个例子中,没有理由期望使用BitsetComposer
的运算符,对吧?因此,当您尝试在不使用至少一个相应类型的情况下重载&
运算符时,编译器会抱怨。
所以你需要制作三种方法:
public static BitsetComposer operator & (BitsetComposer a, BitsetComposer b)
{
return new BitsetComposer(a,b,BitsetComposer.And);
}
public static BitsetComposer operator & (BitSet a, BitsetComposer b)
{
return new BitsetComposer(a,b,BitsetComposer.And);
}
public static BitsetComposer operator & (BitsetComposer a, BitSet b)
{
return new BitsetComposer(a,b,BitsetComposer.And);
}