bin*_*nki 0 c# casting interface
我有一个IFace由类实现的接口Animal.我无法修改IFace或Animal.我希望扩展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.
那么,我如何直接转换到重新实现的接口的基础实现 - 如果这是不可能的,为什么呢?
没有Human定义重新实现接口:
class Human : Animal // , IFace
{
public new void Talk()
{
Console.WriteLine("Hi");
}
}
Run Code Online (Sandbox Code Playgroud)
如果你这样做,调用Talk一个Human将使用新的实现,但调用Talk上的IFace恰好是一个Human将使用基类的实现.
有关更多信息,甚至更奇怪的情况,请参阅本文,围绕界面重新实现.