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