C# 什么';继承和接口实现机制之间的本质区别是什么?
由于接口实际上是一种类型,我总是将接口实现视为一种特殊的继承机制,将接口视为基类型,将实现接口的类型视为派生类型。创建“派生”类型的实例时,“基”类型(我指接口)中定义的方法将添加到方法表中,然后此“派生”类型本身中定义的方法也将添加到方法表中。 当存在“孙子”类型时,它会将其父和祖父(接口)声明中定义的所有方法添加到其方法表中。当然,可以覆盖虚拟方法 我的解释正确吗? 在这种情况下,这似乎是没有意义的:如果孙子再次实现接口怎么办?比如:C# 什么';继承和接口实现机制之间的本质区别是什么?,c#,C#,由于接口实际上是一种类型,我总是将接口实现视为一种特殊的继承机制,将接口视为基类型,将实现接口的类型视为派生类型。创建“派生”类型的实例时,“基”类型(我指接口)中定义的方法将添加到方法表中,然后此“派生”类型本身中定义的方法也将添加到方法表中。 当存在“孙子”类型时,它会将其父和祖父(接口)声明中定义的所有方法添加到其方法表中。当然,可以覆盖虚拟方法 我的解释正确吗? 在这种情况下,这似乎是没有意义的:如果孙子再次实现接口怎么办?比如: interface IFather { void m()
interface IFather { void m(); }
class Son: IFather{}
class Grandson : Son, IFather{}
grands
将接口中的方法添加到其方法表中两次
如果孙子再次实现该接口怎么办?比如:
运行下面的代码,使用和不使用Grandson
实现IFather
并比较结果
如果grands
实现了IFather
:
儿子孙子孙子孙子孙子孙子
孙子
如果孙子
未执行i其他
:
儿子孙子孙子孙子孙子孙子孙子孙子
因此,明确提到Grandson
实现IFather
的主要场景会在Grandson
与Son
的属性/方法的时间上产生差异(在本例中为TypeName
)。使用阴影/隐藏是非常罕见的,因此在现实中几乎没有任何区别-指定两次实现接口通常没有影响(其作用与指定一次相同)
不,它只是实现了实现。这里如何解释“实现”这个词?it和inherit之间的机制区别是什么?@DanielA.WhiteInterface实现就是说“我实现了这个合同”。您仅根据合同“继承”接口。继承是关于“继承”实现(以及契约)。实际上可能是重复的…我发布这个问题只是为了帮助自己弄清楚为什么在使用阴影/隐藏时它的行为会有所不同。这是一个关于界面重新实现的问题,我知道。。。
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();
}
}
}