我有一个由IFace
类实现的接口Animal
。我无法修改IFace
或Animal
。我想用我的子类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>
那么,我如何直接转换到重新实现的接口的基本实现 - 如果这不可能,为什么呢?
答案 0 :(得分:6)
没有Human
定义重新实现界面:
class Human : Animal // , IFace
{
public new void Talk()
{
Console.WriteLine("Hi");
}
}
如果您这样做,Talk
上的调用Human
将使用新实现,但在Talk
上调用恰好是{{1}的IFace
将使用基类&#39;实施
请参阅this article了解更多信息,甚至更奇怪的情况,围绕界面重新实施。