【问题标题】:Why is Predicate<> sealed?为什么 Predicate<> 是密封的?
【发布时间】:2008-10-18 15:11:10
【问题描述】:

我想从 Predicate 派生一个类,但它看起来好像 Predicate 是密封的。就我而言,我想简单地返回指定函数的反转(!)结果。我还有其他方法可以实现目标。我的问题是 MS 设计者在决定密封 Predicate 时可能一直在想什么?

没有多想,我想出了: (a) 简化他们的测试,只是时间与成本的权衡 (b) “不好”可能来自 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

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

【问题讨论】:

  • 当你说“倒置”时,我不确定你的意思。对我来说,从 A 到 B 的函数的逆函数是从 B 到 A 的函数。我认为“否定”可能更清楚。你真正在寻找什么?
  • 我很抱歉,但是在您更新之后,我只是不明白问题是什么:您是在问如何拥有代表列表以及那些不存在的代表 - 您添加被否定的代表?

标签: c# predicate


【解决方案1】:

Predicate&lt;T&gt; 是委托类型。你永远不能从委托中派生。

老实说,在这里继承听起来并不合适——只需编写一个返回原始逆的方法即可。就这么简单:

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

【讨论】:

    【解决方案2】:

    谓词是一个委托。您不能从委托类型继承。 如果要获取反转值,请使用以下内容:

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

    【讨论】:

      【解决方案3】:

      委托的功能是处理类型安全的方法指针列表。 C# 设计人员已决定无需向此功能添加任何内容,也没有理由更改委托的行为。

      所以,Jon 是对的,这里不适合继承。

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

      【讨论】:

        猜你喜欢
        • 2023-03-22
        • 1970-01-01
        • 2016-06-27
        • 2014-12-27
        • 1970-01-01
        • 2010-12-18
        • 1970-01-01
        • 1970-01-01
        • 2017-09-23
        相关资源
        最近更新 更多