【问题标题】:create mustoveride function with code in it创建包含代码的 mustoveride 函数
【发布时间】:2011-05-27 10:46:30
【问题描述】:

我有一个 MustInherit 类,其中包含一些 MustOveride 方法。当我从该类继承时,我会自动获得MustOveride 方法或属性。

我的问题是,我希望能够从一个类继承,获取我的 MustOveride 函数和方法,但其中已经包含一些代码。我曾经见过一个 .net 类,当我从那个类继承时,我得到了方法,其中包含一些 cmets。

有人知道我的意思吗? (这有点难以描述;-))

【问题讨论】:

  • 您能否详细说明一下,“得到方法,其中包含一些 cmets”是什么意思?

标签: c# .net vb.net inheritance


【解决方案1】:

我认为你所描述的被称为Template Method Pattern

 public abstract class MyClass
 {
      public void SomeMethod()
      {
           // code
           MustInherit();
           // code
      }

      protected abstract void MustInherit();
  }

在此示例中创建一个不会被覆盖的方法SomeMethod,并将所有常用代码填充到此类中。然后创建一个必须重写的抽象方法。

如果你想提供一个默认的实现,那么方法一定不能被覆盖,但可以使用virtual关键字。

 public abstract class MyClass
 {
      public void SomeMethod()
      {
           // code
           MustInherit();
           // code
      }

      protected virtual void CanInherit()
      {
           // default implementation
      }
  }

【讨论】:

    【解决方案2】:

    我假设,您希望做到以下几点:
    当您从该抽象基类继承时,您希望这些抽象方法已在您的类中部分实现。
    这是开箱即用的。它可以通过一些模板来实现,但这与 C# 或 VB.NET 无关,而是与使用的 IDE 有关。

    您唯一能做的就是在基类中将该方法创建为virtual(C# - 我不知道它在 VB.NET 中是如何调用的),并在派生类中调用基实现。

    【讨论】:

    • 是的,这正是我想要做的。不幸的是,我期待这个答案;),无论如何谢谢
    【解决方案3】:

    为您服务的抽象类:) 如果您需要抽象类的消费者肯定会覆盖某些方法,那么也将它们标记为抽象。如果您只需要提供覆盖您的方法的可能性,但这不是绝对必要的,那么将它们标记为虚拟的。

    【讨论】:

    • -1: abstract 是 VB.NET 的 MustInherit 的 C# 等价物。
    【解决方案4】:

    使用 virtual 关键字,您不必强制实现继承的方法,那么它将使用基类的默认实现。这样,您就可以从基本方法中继承所有代码。

    否则,您可以实现自己的派生版本的方法,并在其中某处调用基类的方法版本:base.MethodName(...);。这允许您再次从基方法中继承所有代码,但这一次之前和之后的附加代码是特定于您的派生类的。

    否则,您可以使您的基类的方法在其代码中使用委托,并在这里和那里调用它。因此,基类方法的基本功能对于所有派生类都保持不变,但每个派生类都提供了自己的委托来调整基类方法中的一些细节关键代码块。

    否则,如果您想在这里和那里看到部分实现的方法,例如 在此处添加您的代码,这通常是由 Visual Studio 或其他 IDE 等外部工具生成的代码问题,并且具有与语言本身无关。

    但正如您所见,有很多可能性,具体取决于您想要的...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-02
      • 2013-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-20
      • 2018-06-11
      相关资源
      最近更新 更多