由于接口实际上是一种类型,我总是将接口实现视为一种特殊的继承机制,将接口视为基类型,将实现接口的类型视为派生类型。当创建一个‘派生’类型的实例时,在‘基本’类型中定义的方法,我指的是接口,被添加到方法表中,然后在这个‘派生’类型中定义的方法也被添加到方法表中。当有一个‘all’类型时,它会将它的父和祖父(接口)声明中定义的所有方法添加到它的方法表中。当然,虚方法也可以被覆盖。
我的解释正确吗?在这种情况下似乎没有什么意义:如果孙子再次实现该接口怎么办?像这样:
interface IFather { void m(); }
class Son: IFather{}
class Grandson : Son, IFather{}
Grandson
将接口中的方法添加到它的方法表中两次?
发布于 2017-08-26 09:40:32
如果孙子节点再次实现该接口怎么办?像这样:
运行下面的代码,使用和不使用Grandson
实现IFather
,并比较结果。
如果Grandson
实现了IFather
儿子孙子
如果Grandson
不实现IFather
儿子孙子
因此,显式提到Grandson
实现IFather
的主要场景会在Grandson
shadows / hides属性/方法与Son
(本例中为TypeName
)时产生差异。阴影/隐藏的使用非常少见,因此在现实中几乎没有任何区别-指定实现接口两次通常没有影响(它的行为与指定一次相同)。
using System;
namespace Bob
{
public interface IFather
{
string TypeName { get; }
string OverridableTypeName { get; }
}
public class Son : IFather
{
public string TypeName { get; } = "Son";
public virtual string OverridableTypeName { get; } = "Son";
}
public class Grandson : Son //, IFather
{
public string TypeName { get; } = "Grandson";
public override string OverridableTypeName { get; } = "Grandson";
}
public class Program
{
static void Main(string[] args)
{
var son = new Son();
Console.WriteLine(son.TypeName);
Console.WriteLine(son.OverridableTypeName);
Console.WriteLine(((IFather)son).TypeName);
Console.WriteLine(((IFather)son).OverridableTypeName);
var grandson = new Grandson();
Console.WriteLine(grandson.TypeName);
Console.WriteLine(grandson.OverridableTypeName);
Console.WriteLine(((Son)grandson).TypeName);
Console.WriteLine(((Son)grandson).OverridableTypeName);
Console.WriteLine(((IFather)grandson).TypeName);
Console.WriteLine(((IFather)grandson).OverridableTypeName);
Console.ReadLine();
}
}
}
https://stackoverflow.com/questions/45891037
复制相似问题