C#-需要基类上的接口,但只需要派生类中的实现

C#-需要基类上的接口,但只需要派生类中的实现,c#,class,inheritance,interface,abstraction,C#,Class,Inheritance,Interface,Abstraction,我试图创建一个基类,它为许多将从它派生的类提供大量可重用的功能。通过提供此功能,我还希望派生类也能实现某些方法,即实现接口。但是,我不想显式地告诉派生类它们需要实现接口,我希望在基类中定义该需求。因此,基本上,一旦类从基继承,它就可以获得功能,但也需要实现附加方法本身。这就是我想要的,老实说,我不确定这是否可行: public interface IExtraStuff { bool test(); } public class BaseControl : System.Web.UI.Us

我试图创建一个基类,它为许多将从它派生的类提供大量可重用的功能。通过提供此功能,我还希望派生类也能实现某些方法,即实现接口。但是,我不想显式地告诉派生类它们需要实现接口,我希望在基类中定义该需求。因此,基本上,一旦类从基继承,它就可以获得功能,但也需要实现附加方法本身。这就是我想要的,老实说,我不确定这是否可行:

public interface IExtraStuff {
  bool test();
}

public class BaseControl : System.Web.UI.UserControl, IExtraStuff {

  public bool foo(){
    return true;
  }

  // I don't actually want to implement the test() method in this
  // class but I want any class that derives from this to implement it.

}

MyUserControl1 : BaseControl {

  // this.foo() can be used here

  // according to IExtraStuff from the BaseControl, I need to implement test() here

}
基本上,我不想将MyUserControl1定义为:

MyUserControl1 : BaseControl, IExtraStuff
我希望它从
BaseControl
继承额外功能后自动需要该接口

如果这是不可能的,让我知道,那很好。我只是对它了解得不够。正如我目前编写的,它是编译的,我觉得我应该得到一个编译错误,因为
test()
没有在
MyUserControl1
中定义

更新

我已经将我的基类修改为抽象类(在发布到SO之前我已经这样做了),但实际上我可以在不实现抽象方法的情况下构建项目,这就是我开始问这个问题的真正原因。下面的代码是为我构建的,我对此感到困惑:

public interface IExtraStuff {
  bool test();
}

public abstract class BaseControl : System.Web.UI.UserControl, IExtraStuff {

  public abstract bool test();

  public bool foo(){
    return true;
  }

}

MyUserControl1 : BaseControl {

  // this.foo() can be used here

  // I can build without implementing test() here!

}
更新2:问题已解决

事实证明,我的解决方案构建设置中有一个问题,除非我从基础实现抽象方法(现在),否则项目不会构建。这是我在VisualStudio中的错误,而不是类体系结构中的错误。谢谢大家的帮助

使用抽象方法

public abstract class BaseControl : System.Web.UI.UserControl, IExtraStuff { 

  public bool foo(){ 
    return true; 
  } 

  public abstract bool test();  
} 
有关更多信息,请参阅:

编辑 添加dervied类impl

public class MyCustomControl : BaseControl { 

  public override bool test()
  {
    //Add Code...
  }  
} 

如果将BaseControl设置为抽象类,则可以省略接口成员,从而强制在子类中实现。

这就是抽象类和方法的用途

public abstract class BaseControl : IExtraStuff
{
   public abstract bool test();
}

请注意,该类也需要标记为抽象类

您还必须将该类标记为抽象类,否则会出现编译错误。我实际尝试了这一点,并且在我的派生类中,我不需要定义
test()
以及键入
test()时
在代码块中,它从基类获取它,就好像它有一个已定义的主体,而它没有。现在正在阅读那篇文章…@Mark如果您正确地将该类标记为抽象类(不确定Jeff编辑的时机),那么您将得到生成错误,告诉您具体类需要实现抽象方法test(),再次感谢Matt,在添加注释之前,正在添加派生类的impl:D@Matt,我确实将该类标记为抽象类,但我没有在派生类中定义
test()
的实现,我可以构建该项目!这就是促使我问这个问题的原因,我真的很困惑它为什么会构建!在我实现该方法之前,我一直希望出现编译时错误。您不能忽略接口成员,但可以通过将它们标记为抽象来保持它们未实现。我假设MyUserControl1:BaseControl是一个公共类?因为发布的内容不应该编译吗?是的,我加入了一个简单的示例,但错过了那个关键字。总体错误出现在Visual Studio中的项目设置和生成中。我的错,不是架构的问题。