转换为重新实现接口的基接口实现

bin*_*nki 0 c# casting interface

我有一个IFace由类实现的接口Animal.我无法修改IFaceAnimal.我希望扩展Animal我的子类Human并重新实现它IFace.但是,我希望能够Human在类型变量中存储一个实例,IFace以便访问该变量Animal直接使用实现 - 就像变量的类型一样Animal.

https://dotnetfiddle.net/6JjNfR

using System;

interface IFace
{
    void Talk();
}
class Animal : IFace
{
    public void Talk()
    {
        Console.WriteLine("Oink");
    }
}
class Human : Animal, IFace
{
    public new void Talk()
    {
        Console.WriteLine("Hi");
    }
}

public class Program
{
    public static void Main()
    {
        var human = new Human();
        human.Talk();

        var face = (IFace)human;
        face.Talk();

        var animal = (Animal)human;
        animal.Talk();

        var face2 = animal;
        face2.Talk();

        IFace face3;
        face3 = human;
        face3.Talk();

        // How to get the following to oink like animal?
        face3 = animal;
        face3.Talk();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是可能的还是我必须创建如下的代理类?

https://dotnetfiddle.net/marXND

class AnimalProxy : IFace
{
    Animal Animal { get; set; }

    public AnimalProxy(Animal animal)
    {
        Animal = animal;
    }

    public void Talk()
    {
        Animal.Talk();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果代理是必需的,如果我可以通过转换来访问Animal实现,为什么需要代理?IFaceAnimal

我敢打赌,答案有事情做与如何明确的接口工作,以及如何铸造Human一个Animal,然后再铸造IFace 返回Human的实现......也许隐式接口实现语法只是让C#编译器自动生成一个明确的执行刚刚调用隐实现.这意味着,当我向某些东西投射时,Animal我正在访问Animal方法而不是IFace方法,即使这些相同的方法是"隐式"实现IFace.

那么,我如何直接转换到重新实现的接口的基础实现 - 如果这是不可能的,为什么呢?

Ser*_*rvy 6

没有Human定义重新实现接口:

class Human : Animal // , IFace
{
    public new void Talk()
    {
        Console.WriteLine("Hi");
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你这样做,调用Talk一个Human将使用新的实现,但调用Talk上的IFace恰好是一个Human将使用基类的实现.

有关更多信息,甚至更奇怪的情况,请参阅本文,围绕界面重新实现.