C# всегда вызывать базовый метод из базового класса

Предположим, что у нас есть следующие классы:

class A {
   public virtual int Number { get { return 1; } }

   public int Foo(){
      return Number;
   }
}

class B : A{
   public override int Number { get { return 2; } }
}

Как и ожидалось, если я вызову метод Foo для экземпляра класса B, я получу 2. Возможно ли изменить метод Foo таким образом, чтобы он всегда использовал базовое свойство A.Number (и вернуть 1) Что-то вроде:

public int Foo(){
   return A.Number; 
}

2 ответа

Решение

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

class A
{
    public virtual int Number { get { return Foo(); } }

    public int Foo()
    {
        return 1;
    }
}

"Настоящее" определение заключается в не виртуальном члене, и виртуальный член просто вызывает его. Это гарантирует, что вы пишете функциональность только один раз, и в то же время демонстрируете ее как в виртуальной, так и в не виртуальной среде.

Вы можете использовать "базу" для использования методов и свойств класса А.

class B : A
    {
        public override int Number { get { return 2; } }

        public new int Foo()
        {
            return base.Number;
        }
    }
Другие вопросы по тегам