C # - требует интерфейс на базовом классе, но только реализации в производных классах - PullRequest
2 голосов
/ 10 ноября 2010

Я пытаюсь создать базовый класс, который предоставляет большое количество многократно используемых функций для многих классов, которые будут производными от него. Предоставляя эту функциональность, я хотел бы также требовать, чтобы производные классы также реализовывали определенные методы, то есть реализовывали интерфейс. Однако я не хочу явно указывать производным классам, которые им нужны для реализации интерфейса, я хочу, чтобы это требование было определено в базовом классе. Таким образом, в основном, как только класс наследует от базы, он получает функциональность, но также и требование реализовывать дополнительные методы самостоятельно. Вот что я хочу, и я, честно говоря, не уверен, возможно ли это:

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, а не ошибка в архитектуре класса. Всем спасибо за помощь!

Ответы [ 3 ]

4 голосов
/ 10 ноября 2010

Использовать абстрактные методы?

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

Редактировать Добавление импровизированного класса impl.

public class MyCustomControl : BaseControl { 

  public override bool test()
  {
    //Add Code...
  }  
} 
2 голосов
/ 10 ноября 2010

Вот что такое абстрактные классы и методы для

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

Обратите внимание, класс также должен быть помечен как абстрактный

1 голос
/ 10 ноября 2010

Если вы сделаете BaseControl абстрактным классом, вы можете опустить элементы интерфейса и, следовательно, принудительно реализовать реализацию в дочерних классах.

...