Просто позвоните в конструктор базового класса. Любой полученный объект должен вызвать конструктор базового класса, так что вы гарантированно, что обязательный метод всегда вызывается при создании объекта:
public abstract class Base
{
protected Base()
{
//....
mandatoryMethod();
}
private void mandatoryMethod() { ... }
public abstract Foo Frob();
}
public class Derived: Base
{
public Derived(....)
{
//new Base() will have been called when execution reaches this point.
}
public override Foo Frob() { ... }
}
это, конечно, имеет некоторые ограничения:
- Если
MandatoryMethod
потребности в вызываться после завершения конструктора Derived
, это не сработает.
- Если ваш трудный вызов «обязательный вызов» означает вызов
MandatoryMethod
перед вызовом любого метода Derived
, это не сработает, и вы не сможете его применить. Ваш единственный вариант - проверка кода, если у вас есть код всех потребителей или изменение требования, если вы этого не сделаете.
Работа компилятора заключается в компиляции правовой код и запретить нелегальную код. Нет ничего незаконного в том, что вы не вызываете от Derived
любой данный метод, определенный в Base
; это логическая потребность в вашем приложении, а не требование языка. Вы не можете принудительно применять это с помощью компилятора, тем ближе вы можете использовать конструкторское решение, где компилятор действительно гарантирует, что MandatoryMethod
будет на самом деле всегда вызываться при построении объекта Derived
.
Вы не смогли найти текущий код? – fubo
Трудно догадаться без кода, но я не могу придумать ошибку компилятора для _not вызова метода_. –
Когда следует вызывать метод? Если он должен быть вызван во время создания, базовый класс должен выставлять только требуемый конструктор. В противном случае логика должна быть отменена, если базовый класс имеет открытый метод, который вызывает абстрактный (защищенный) метод, который должны реализовать все наследники. –