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中的项目设置和生成中。我的错,不是架构的问题。