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

时间:2015-02-18 19:23:11

标签: c# interface casting

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

https://dotnetfiddle.net/6JjNfR

Animal

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

https://dotnetfiddle.net/marXND

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();
    }
}

如果需要代理,如果我只需转发到class AnimalProxy : IFace { Animal Animal { get; set; } public AnimalProxy(Animal animal) { Animal = animal; } public void Talk() { Animal.Talk(); } } 即可访问Animal IFace的实现,为什么需要代理?

我敢打赌,答案与显式界面如何工作以及如何将Animal转换为Human,然后再投射到Animal 有关return IFace的实现...也许隐式接口实现语法只是让C#编译器自动生成一个只调用隐式实现的显式实现。这意味着当我向Human投射内容时,我正在访问Animal方法而不是Animal方法,即使这些方法是IFace的“隐式”实现。< / p>

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

1 个答案:

答案 0 :(得分:6)

没有Human定义重新实现界面:

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

如果您这样做,Talk上的调用Human将使用新实现,但在Talk上调用恰好是{{1}的IFace将使用基类&#39;实施

请参阅this article了解更多信息,甚至更奇怪的情况,围绕界面重新实施。