首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >继承和接口实现机制之间的本质区别是什么?

继承和接口实现机制之间的本质区别是什么?
EN

Stack Overflow用户
提问于 2017-08-26 09:06:17
回答 1查看 43关注 0票数 0

由于接口实际上是一种类型,我总是将接口实现视为一种特殊的继承机制,将接口视为基类型,将实现接口的类型视为派生类型。当创建一个‘派生’类型的实例时,在‘基本’类型中定义的方法,我指的是接口,被添加到方法表中,然后在这个‘派生’类型中定义的方法也被添加到方法表中。当有一个‘all’类型时,它会将它的父和祖父(接口)声明中定义的所有方法添加到它的方法表中。当然,虚方法也可以被覆盖。

我的解释正确吗?在这种情况下似乎没有什么意义:如果孙子再次实现该接口怎么办?像这样:

代码语言:javascript
运行
复制
interface IFather { void m(); }

class Son: IFather{}

class Grandson : Son, IFather{}

Grandson将接口中的方法添加到它的方法表中两次?

EN

回答 1

Stack Overflow用户

发布于 2017-08-26 09:40:32

如果孙子节点再次实现该接口怎么办?像这样:

运行下面的代码,使用和不使用Grandson实现IFather,并比较结果。

如果Grandson实现了IFather

儿子孙子

如果Grandson不实现IFather

儿子孙子

因此,显式提到Grandson实现IFather的主要场景会在Grandson shadows / hides属性/方法与Son (本例中为TypeName)时产生差异。阴影/隐藏的使用非常少见,因此在现实中几乎没有任何区别-指定实现接口两次通常没有影响(它的行为与指定一次相同)。

代码语言:javascript
运行
复制
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();
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45891037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档