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

时间:2010-11-10 20:39:19

标签: c# class inheritance interface abstraction

我正在尝试创建一个基类,它为从它派生的许多类提供了大量可重用的功能。通过提供此功能,我还要求派生类也实现某些方法,即实现接口。但是,我不想明确告诉他们实现接口所需的派生类,我希望在基类中定义该需求。所以基本上,一旦一个类从基类继承,它就会获得功能,但也需要自己实现其他方法。这就是我想要的,而且老实说我不确定这是否可行:

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:问题已解决

事实证明我的解决方案构建设置存在问题,除非我从基础(现在)实现抽象方法,否则项目不会构建。这是我在Visual Studio中的错误,而不是类架构中的错误。感谢所有人的帮助!

3 个答案:

答案 0 :(得分:4)

使用抽象方法?

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

  public bool foo(){ 
    return true; 
  } 

  public abstract bool test();  
} 

有关详情,请参阅: http://msdn.microsoft.com/en-us/library/aa664435(VS.71).aspx

修改 添加dervied class impl。

public class MyCustomControl : BaseControl { 

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

如果将BaseControl设为抽象类,则可以省略接口成员,因此强制实现子类。