Вызовите EIMI в базовом типе из EIMI производного типа - PullRequest
0 голосов
/ 10 января 2020

Есть ли альтернативы, если я решу привести базовое ключевое слово к интерфейсу?

Следующий код не будет работать из-за ошибки времени компиляции:

Использование ключевое слово base является недопустимым в этом контексте [Console.NET] csharp (CS0175)

using System;
using System.Collections;

namespace myprogram
{
    public interface I
    {
        void foo();
    }

    public class B : I
    {
        void I.foo()
        {
            Console.WriteLine("in B foo");
        }
    }

    public class D : B, I
    {
        void I.foo()
        {
            Console.WriteLine("in D foo");
            I i = base;
            i.foo();
        }
    }

    public static class Program
    {
        public static void Main()
        {
            I d = new D();
            d.foo();
        }
    }
}

В приведенном выше коде я хочу получить следующий вывод:

in D foo
in B foo

с использованием интерфейса I и типа D, получаемого из B.

Или невозможно вызвать EIMI в базовом типе из EIMI производного типа?

1 Ответ

2 голосов
/ 10 января 2020

Невозможно использовать base в таком виде в C# I i = base;. Вы можете использовать base.foo(), но это не работает с явной реализацией интерфейса, как объяснено в комментариях OP.

Возможным обходным путем может быть добавление вспомогательного виртуального метода и переопределение его в производном классе (и удаление явной реализации во втором классе)

public class B : I
{
    void I.foo()
    {
        Bar();
    }

    protected virtual void Bar()
    {
        Console.WriteLine("in B foo");
    }
}

public class D : B
{
    protected override void Bar()
    {
        base.Bar();
        Console.WriteLine("in D foo");
    }
}

Вывод будет следующим

in B foo 
in D foo

Существует также более простая опция без явной реализации интерфейса

public class B : I
{
    public virtual void foo()
    {
        Console.WriteLine("in B foo");
    }
}

public class D : B
{
    public override void foo()
    {
        base.foo();
        Console.WriteLine("in D foo");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...