【问题标题】:Implement a delegate that overrides an abstract method in C#在 C# 中实现一个覆盖抽象方法的委托
【发布时间】:2011-09-28 20:53:46
【问题描述】:

我对 .Net 还很陌生,我显然在这里做错了什么。在我的基础抽象类中,我有以下委托:

public delegate bool DEnqueue(ref IPCPriorityMessage item, byte priority);

...以及以下方法声明:

public abstract DEnqueue Enqueue();

在我的实例类中,我有以下内容:

public override DEnqueue Enqueue;

我将 Enqueue 指向适用的本地方法。如果我不使用继承或不使用委托,我只能让它工作。

我的确切目标是:

  1. 使用基本抽象类来强制设计模式。实例必须包含方法 Engueue()。
  2. 在实例类中使用委托,以便在调用公共 Enqueue() 方法时调用适用的私有 enqueue() 方法。

我该怎么做?我尝试使用接口,但问题基本相同。

注意:我只在运行时知道要使用哪个私有 enqueue(),因此我使用了委托。

【问题讨论】:

    标签: .net inheritance c#-4.0 delegates abstract-class


    【解决方案1】:

    您似乎正在寻找Template Method Pattern。无需使用委托。

    【讨论】:

    • 其他都是模板。但是如果不使用委托,我必须进行双重调用,即一个到公共实例方法+ 1 通过委托(或 if 语句)到内部方法。
    • 是的。那不好吗?请注意,第二次调用发生在您的第一个方法中,因此它对调用者是透明的。
    • 不错...只是有点开销,我宁愿没有。我试图做的事情是不可能的吗?
    • 我不完全理解你想要达到的目标。您似乎想用委托替换一个方法,这是不可能的。我的理解对吗?不过,您始终可以从方法中调用委托。
    • 我有两种可能的私有方法,我想将一个公共方法映射到。根据对象的初始化,将其中一个内部类分配给公共类。
    【解决方案2】:

    首先,您的基类中的方法声明可能并没有说出您的想法。它说的是Enqueue 方法返回一个DEnqueue 类型的委托,而不是该方法与委托具有相同的类型。

    您可以做的是在您的基类中拥有DEnqueue 类型的属性:

    public abstract DEnqueue Enqueue { get; }
    

    您可以(或实际上必须)使用委托来实现它:

    private DEnqueue m_enqueue;
    
    public override DEnqueue Enqueue
    {
        get { return m_enqueue; }
    }
    

    您可以像调用方法一样在属性中调用委托。

    【讨论】:

    • 谢谢。你知道这种模式是否会比在典型的模板方法模式中使用非委托更快吗? (根据其他答案)
    • @IanC,询问像这样的性能有过早优化的味道。只需为您的案例使用更好的设计(这可能是模板方法模式)。但是如果你真的必须知道:调用委托比调用普通方法慢,那么使用委托将会(可能无法测量)更慢。另一方面,如果选择正确方法的条件很慢,使用委托可能会更快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多