2016-06-14 5 views
-1

У меня есть несколько классов, которые наследуют абстрактный класс. Я сделал один метод в базовом классе, который является общим для всех дочерних классов. Я хочу, чтобы все дочерние классы принудительно вызывали этот метод, иначе должна отображаться ошибка компиляции.Как принудительно вызвать базовый метод от дочернего

Как я могу это достичь?

+3

Вы не смогли найти текущий код? – fubo

+2

Трудно догадаться без кода, но я не могу придумать ошибку компилятора для _not вызова метода_. –

+2

Когда следует вызывать метод? Если он должен быть вызван во время создания, базовый класс должен выставлять только требуемый конструктор. В противном случае логика должна быть отменена, если базовый класс имеет открытый метод, который вызывает абстрактный (защищенный) метод, который должны реализовать все наследники. –

ответ

1

Просто позвоните в конструктор базового класса. Любой полученный объект должен вызвать конструктор базового класса, так что вы гарантированно, что обязательный метод всегда вызывается при создании объекта:

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() { ... } 
} 

это, конечно, имеет некоторые ограничения:

  1. Если MandatoryMethod потребности в вызываться после завершения конструктора Derived, это не сработает.
  2. Если ваш трудный вызов «обязательный вызов» означает вызов MandatoryMethod перед вызовом любого метода Derived, это не сработает, и вы не сможете его применить. Ваш единственный вариант - проверка кода, если у вас есть код всех потребителей или изменение требования, если вы этого не сделаете.

Работа компилятора заключается в компиляции правовой код и запретить нелегальную код. Нет ничего незаконного в том, что вы не вызываете от Derived любой данный метод, определенный в Base; это логическая потребность в вашем приложении, а не требование языка. Вы не можете принудительно применять это с помощью компилятора, тем ближе вы можете использовать конструкторское решение, где компилятор действительно гарантирует, что MandatoryMethod будет на самом деле всегда вызываться при построении объекта Derived.

+0

Конкретный конструктор (ваш 'public Base()') класса 'abstract' не должен быть общедоступным. Публикация является немного запутанной, так как вы не можете сказать 'new Base()' в любом месте, единственное использование для конструктора - это связать ее с производными классами, поэтому в этом случае нормально сказать 'protected Base()'. –

+0

@JeppeStigNielsen Очень верно! Исправлено, спасибо – InBetween

+0

Спасибо .. Решение конструктора помогло .. –

Смежные вопросы