2008-10-18 76 views
5

我想从谓词< IMyInterface>派生一个类,但它看起来好像是封闭了谓词<>。在我的情况下,我只想返回指定函数的反转(!)结果。我有其他的方法来完成这个目标。我的问题是,MS设计师在决定封存Predicate <>时可能会考虑什么?为什么Predicate <>被密封?

没有太多的想法,我想出了: (一)简化他们的测试,只是一个时间与成本的权衡 (二)“没有好”可能来自衍生自谓<>

你这是什么认为?

更新:在初始化阶段,有n个谓词动态添加到谓词列表中。每个都是互斥的(如果添加了Abc,NotAbc将不会被添加)。我观察到的,看起来像一个模式:

bool Happy(IMyInterface I) {...} 
bool NotHappy(IMyInterface I) { return !Happy(I); } 
bool Hungry(IMyInterface I) {...} 
bool NotHungry(IMyInterface I) { return !Hungry(I); } 
bool Busy(IMyInterface I) {...} 
bool NotBusy(IMyInterface I) { return !Busy(I); } 
bool Smart(IMyInterface I) {...} 
bool NotSmart(IMyInterface I) {...} //Not simply !Smart 

它不是我能不能解决问题,它说我不知道​​为什么我没能解决它以某种方式。

+0

当你说“倒置”时,我不确定你的意思。对我而言,从A到B的函数的反函数是从B到A的函数。 我认为“否定”可能会更清晰。 你在找什么? – 2008-10-18 16:39:27

回答

4

谓词是一个委托。您不能从委托类型继承。 如果你想要得到的反转值,使用以下命令:

Predicate<T> p; 
Predicate<T> inverted = t => !p(t); 
19

Predicate<T>是一个委托类型。你永远无法从代表派生。

说实话,这听起来并不像继承在这里真的很合适 - 只需编写一个返回原始反转的方法即可。就像这样简单:

public static Predicate<T> Invert<T>(Predicate<T> original) 
{ 
    return t => !original(t); 
} 
2

委托的功能是处理类型安全方法指针的列表。 C#设计人员已经决定没有什么可以添加到此功能,并且没有理由将行为更改为委托。

因此,乔恩是对的,在这里继承是不合适的。

代表可以指向一个方法列表。我们使用+ =运算符或Delegate.Combine添加到此列表中。如果方法的签名不是无效的,则返回最后调用方法的结果(如果正确调用)。

相关问题