Я пытаюсь создать базовый класс, который предоставляет большое количество многократно используемых функций для многих классов, которые будут производными от него. Предоставляя эту функциональность, я хотел бы также требовать, чтобы производные классы также реализовывали определенные методы, то есть реализовывали интерфейс. Однако я не хочу явно указывать производным классам, которые им нужны для реализации интерфейса, я хочу, чтобы это требование было определено в базовом классе. Таким образом, в основном, как только класс наследует от базы, он получает функциональность, но также и требование реализовывать дополнительные методы самостоятельно. Вот что я хочу, и я, честно говоря, не уверен, возможно ли это:
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
.
UPDATE
Я изменил свой базовый класс, чтобы он стал абстрактным (я делал это до публикации в 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, а не ошибка в архитектуре класса. Всем спасибо за помощь!