Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 确保覆盖了所有虚拟方法_C#_Oop_Virtual Functions - Fatal编程技术网

C# 确保覆盖了所有虚拟方法

C# 确保覆盖了所有虚拟方法,c#,oop,virtual-functions,C#,Oop,Virtual Functions,我有一个基类,需要确保在类专门化中覆盖所有虚拟方法。我不能使用抽象类/方法,因为我还需要在基本方法中执行一些代码 我该怎么做 public class BaseClass { public virtual void DoStuff() { // do something } } public class DerivedClass : BaseClass { public override void DoStuff() { // do derived wor

我有一个基类,需要确保在类专门化中覆盖所有虚拟方法。我不能使用抽象类/方法,因为我还需要在基本方法中执行一些代码

我该怎么做

public class BaseClass
{
  public virtual void DoStuff()
  {
    // do something
  }
}

public class DerivedClass : BaseClass
{
  public override void DoStuff()
  {
     // do derived work
     base.DoStuff();
  }
}

使用挂钩,更好地称为:


这是我最喜欢的,也是许多框架的基础:不要打电话给我们,我们会打电话给你

如果实现这样一个抽象类,它将满足您的需要

public abstract class BaseClass
{

  protected abstract void doAbstractStuff();

  public void DoStuff()
  {
    //base class code lives here
    doAbstractStuff();
    //or here?
  }
}

我不确定是否有一种简单的方法可以做到这一点,但您可以这样做:

public class BaseClass
{
  public abstract void DoStuff();

  protected void DoStuffInternal()
  {
    // do something
  }
}

public class DerivedClass : BaseClass
{
  public override void DoStuff()
  {
     // do derived work
     DoStuffInternal();
  }
}

即使你可以(我不相信你可以),你也不能强迫实现者在重写你的基本方法时调用它们——这也是一个要求吗?@Damien_不相信者嗯,我有一堆测试代码需要在一些存储库上测试。因此,我需要确保如果我将测试添加到“基本测试类”,那么存储库的所有测试都会测试我添加的新测试。基本上,我试图克服nunit的TestCaseAttribute只支持基本类型的限制。对此,有很多相当简单的解决方案,但它们都破坏了nunit测试概述,使我很难确定哪些测试在哪些类上失败。这意味着你必须记住对每个DerivedClass调用内部方法?@Paddy我认为这为使用基类生成派生类增加了一个人工步骤用法不直观。应该添加注释。dcastro的答案比这好得多-他得到了我的投票:)我需要在基类方法doAbstractStuff()中添加一些代码,但这意味着只需将要求改为执行Start()-方法,对吗?哦,等等-你的构造做的是让基类调用派生类。要求是另一种方式-我希望派生类调用基类。@JesperLundStocholm是的,这确保了派生实现被调用,因为抽象类自己调用它。您不能强制所有派生类调用基类-恐怕您无法强制执行此规则。文档和团队纪律是您的最佳选择。
public class BaseClass
{
  public abstract void DoStuff();

  protected void DoStuffInternal()
  {
    // do something
  }
}

public class DerivedClass : BaseClass
{
  public override void DoStuff()
  {
     // do derived work
     DoStuffInternal();
  }
}