【问题标题】:C# virtual methodsC# 虚拟方法
【发布时间】:2015-08-06 09:17:35
【问题描述】:

在 C++ 中我能够做到这一点

class App
{
public:
    virtual void OnMouseMove(etc);
    void FunctionThatDoesStuff();
};

void App::FunctionThatDoesStuff()
{
    // Engine stuff here
    OnMouseMove(etc);
}

class ProjectName : public App
{
public:
    void OnMouseMove(etc);
};

void ProjectName::OnMouseMove(etc)
{
    // User stuff here
}

然后,当从 App 中的 FunctionThatDoesStuff 调用 OnMouseMove 时,它​​将被覆盖并改为调用 ProjectName.OnMouseMove。但在 C# 中,我无法做到这一点。这是我的第一次尝试。

public class App
{
    protected void MouseMove()
    {
        // Engine code here
        OnMouseMove(etc);
    }

    protected virtual void OnMouseMove(etc)
    {
        // Do Nothing
    }
}

public class ProjectName : App
{
    protected override void OnMouseMove(etc)
    {
        // User code here
    }
}

我尝试使用委托,因为它们只是未实现的功能。但是这没有用。我怎样才能在 C# 中实现等价物?我想我可以解决它并使用事件。但是有没有更类似的方法来做到这一点。

【问题讨论】:

  • 您从App 拨打OnMouseMove 并称它正在实施中? could work around it 到底是什么意思?
  • @SriramSakthivel 谢谢。我对问题进行了编辑。
  • 您是否创建了AppProjectName 的实例。显示代码你是如何使用它的。

标签: c# c++ oop inheritance virtual


【解决方案1】:

假设您有默认实现:MouseMove,在 App 类中。

public class App
{
    protected void MouseMove()
    {
        // Engine code here
    }

    protected virtual void OnMouseMove(object etc)
   {

   // Default implementation here
    Console.WriteLine('A');

   }
}

然后你有第二类ProjectName 和另一个实现

public class ProjectName : App
{
    protected override void OnMouseMove(etc)
    {
        // Overrride implementation

         Console.WriteLine('B')
    }
}

然后当你有类型的对象时:App 它将打印 A 当你有 Object of type: 'ProjectName' 它会打印 B

    var app = new App();

    var project = new ProjectName();

    app.OnMouseMove();
// Will Print A

    project.OnMouseMove();
// Will Print B

【讨论】:

  • 您可能错过了编辑。 MouseMove 调用 OnMouseMove 以便在用户自己的 OnMouseMove 实现中无需用户看到引擎代码即可实现。
  • 是的,在这种情况下,您将不得不使用已接受答案中提到的抽象方法。
【解决方案2】:

如果我理解您在谈论抽象方法或类:

public abstract class App
{
    protected void MouseMove()
    {
        // Engine code here
    }

    protected abstract void OnMouseMove(object etc);
}

public class ProjectName : App
{
    protected override void OnMouseMove(object etc)
    {
        // User code here
    }
}

【讨论】:

  • 这就是我要找的。谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-09-09
  • 1970-01-01
  • 2012-11-30
  • 2016-09-28
  • 2011-12-19
  • 2010-11-17
  • 1970-01-01
相关资源
最近更新 更多