首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在多态中使用基类和接口?

在多态中使用基类和接口的原因是为了实现代码的可扩展性和可维护性。多态允许程序员编写通用的代码,这些代码可以应用于许多不同的对象,而无需关心这些对象的具体实现。

在面向对象编程中,基类和接口是实现多态的两种方式。基类是一个包含一些通用属性和方法的类,它可以被其他类继承。接口是一个定义了一组方法的抽象类,它可以被其他类实现。

使用基类和接口的好处是可以让程序员编写通用的代码,这些代码可以应用于许多不同的对象,而无需关心这些对象的具体实现。这可以大大减少代码的重复,提高代码的可维护性和可扩展性。

例如,假设有一个基类Animal和一个接口IFly,Animal类包含一些通用的属性和方法,IFly接口定义了一组飞行的方法。现在,如果程序员想要编写一个通用的函数,该函数可以接受任何一种动物并让它飞行,他可以这样做:

代码语言:python
代码运行次数:0
复制
def fly(animal: Union[Animal, IFly]) -> None:
    animal.fly()

在这个函数中,我们使用了基类Animal和接口IFly,这样就可以接受任何一种动物并让它飞行。这样做的好处是可以让程序员编写通用的代码,这些代码可以应用于许多不同的对象,而无需关心这些对象的具体实现。

总之,在多态中使用基类和接口的原因是为了实现代码的可扩展性和可维护性。基类和接口可以让程序员编写通用的代码,这些代码可以应用于许多不同的对象,而无需关心这些对象的具体实现。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Python接口协议和抽象

比如Sequence的正式接口如下图所示: 这些都叫做Python接口。事实上,Python每个都有接口,除了抽象。...比如只要实现了__getitem__方法,按照序列协议的约定,Python就会支持这个完成访问元素、迭代使用in运算符等一系列操作。...Python的collections.abc模块中就定义了很多抽象: 虽然我们实际编程并不会自己编写抽象(一般也不建议这样做,因为可能会导致意想不到的问题),但是了解抽象,可以帮助我们更好理解...抛开枯燥的理论知识,我书中找到了一处具有实践价值的片段: 「一连串if/elif/elif中使用isinstance做检查,然后根据对象的类型执行不同的操作,通常是不好的做法;此时应该使用多态,即采用一定的方式定义...Python不会检查虚拟子类是否实现了抽象要求实现的方法,而是由我们自己保证,并捕获异常。具体会在下篇文章《Python抽象的定义与使用》进行介绍。

1.8K30
  • Dart 的抽象多态接口

    Dart的抽象 Dart抽象主要用于定义标准,抽象定义继承它的子类必须有哪些方法。 抽象通过abstract关键字来定义,抽象没有方法体的方法称为抽象方法,类似于C++的虚函数。...Dart多态 Dart多态与C++的虚相似,允许将子类类型的指针赋值给父类型的指针。...实现上,将子类的实例赋值给父的引用,父的引用调用父存在的抽象方法,从而间接的调用在子类覆写的抽象方法。 ? 3....Dart接口 DartJava一样也有接口,但是Java还是有区别的。 Dart的定义接口无需interface关键字,同样使用 implements 关键字进行实现。...Dart如果实现的是普通,会将普通抽象的属性的方法全部需要覆写一遍。 ? 4. Dart中一个实现多个接口 ? extends抽象 implements 的区别: 1.

    2.4K20

    java_抽象接口多态使用

    抽象,可以有构造方法,是供子类创建对象时,初始化父成员使用的。 抽象,不一定包含抽象方法,但是有抽象方法的必定是抽象。...接口的定义,它与定义方式相似,但是使用 interface 关键字 接口使用,它不能创建对象,但是可以被实现( implements ,类似于被继承) 。...接口的多继承 一个接口能继承另一个或者多个接口,这之间的继承比较相似。接口的继承使用 extends 关键字,子接口继 承父接口的方法。如果父接口中的默认方法有重名的,那么子接口需要重写一次。...多态体现的格式: 父类型 变量名 = new 子类对象; 变量名.方法名(); 父类型:指子类对象继承的父类型,或者实现的父接口类型。...当使用多态方式调用方法时,首先检查父是否有该方法,如果没有,则编译错误;如果有,执行的是子类重写 后方法。

    39910

    Java--多态性之抽象接口

    上一篇:多态性之上溯造型下溯造型 抽象(abstract)可以含有一个或多个抽象方法(只有方法的定义而没有方法的实现),也可以不含有抽象方法。...接口中的数据成员(字段)默认为staticfinal, 成员函数(方法)默认为public。所以实现一个接口时,来自接口的方法必须也是public。...实现按一个接口使用 implements(实现)关键字,其他操作和继承非常类似。 Java的“多重继承”可以靠接口实现。因为Java只能单一继承而接口可以多继承。...只有必须使用方法定义或者成员变量的时候,才应考虑采用抽象接口的一个应用--常数分组: 因为接口的字段都默认为finalstatic,所以很适合常数分组。...不过比起直接将数字硬编码到程序,这样实现起来的代码可读性更强。 下一篇:多态性之内部类匿名

    54340

    python3--归一化设计,接口抽象接口隔离原则,多态

    抽象接口 继承有两种用途 1 继承的方法,并且做出自己的改变或者扩展(代码重用) 2 声明某个子类兼容于某,定义一个接口Interface,接口定义了一些接口名(就是函数名)且并未实现接口的功能...抽象是一个介于接口之间的一个概念,同时具备接口的部分特性,可以用来实现归一化的设计 1 多继承问题 继承抽象的过程,我们应该尽量避免多继承 而在继承接口的时候,我们反而鼓励你来多继承接口...java,能够满足接口隔离原则,且完成多继承的约束 而在python,满足接口隔离原则,由于python本身支持多继承,所以就不需要接口的概念了 抽象接口 python 并没有什么不同...qq支付了100元 使用微信支付了200元 多态鸭子类型 多态 通过继承实现 python不需要刻意实现多态,因为python本身自带多态效果 鸭子类型 Python崇尚鸭子类型,即‘如果看起来像...多态 通过继承实现 java一个之下发展出来的多个的对象都可以作为参数传入一个函数或者方法 python不需要 鸭子类型 不是通过具体的继承关系来约束某些必须有哪些方法名,是通过一种约定俗成的概念来保证多个相似的功能叫相同的名字

    2.5K10

    Python 多态性的示例的继承多态

    单词 "多态" 意味着 "多种形式",在编程,它指的是具有相同名称的方法/函数/操作符,可以许多不同的对象或上执行。...函数多态性 一个示例是 Python 的 len() 函数,它可以用于不同的对象。 字符串 对于字符串,len() 返回字符的数量: 示例 x = "Hello World!"...多态性通常在的方法中使用,其中我们可以具有相同方法名称的多个。...由于多态性,我们可以为所有三个执行相同的方法。 继承多态性 那么具有相同名称的子类的呢?我们能在那里使用多态吗?...如果我们使用上面的示例,并创建一个名为 Vehicle 的父,并将 Car、Boat Plane 作为 Vehicle 的子类,子类将继承 Vehicle 的方法,但可以重写它们: 示例,创建一个名为

    21010

    项目实战如何使用抽象接口

    引子: 时常会有这么一个疑惑,抽象接口功能好像,真正用起来该如何抉择呢?? 好问题。。 来看看书上怎么说的(C#7.0本质论) 虽然方法可在声明为抽象成员,但是!!...如果都从一个派生,会用掉唯一的机会,(什么意思呢:也就是C#的单继承特性了),所以,什么都往里面加,就会显得特别臃肿,且不通用。 所以,原则就是:大共性你给我放,小共性用接口。...但是你给动物的里面加一个动物飞行(虽然动物里面的鸟、鸡等都可以飞,但是喵狗你怎么飞啊),所以,这个加的就很不理智,虽然也是个共性,但是个小共性。...所以,这个小共性用接口实现就非常的Nice,为何呢(因为C#是单继承多接口啊!),也就是说,你的狗子不会飞就不要来接触这个接口咯,会飞的动物,除了继承,再加个接口就OK了。...:很显然就把移动、打怪、聊天设置为了;而剩下的则以接口出现,当然至于为什么要用接口,可以看上一篇关于抽象的文章,道理差不多。

    87910

    C# 定义好方法让子类继承接口就能实现

    C# 里面,接口的定义只需要里面存在接口声明相同的方法或属性就可以,而存在的方法或属性是子类定义的还是里面定义的都无所谓。...也就是里面写好了方法,但不继承接口,等子类继承接口的时候就不需要子类实现方法。...通过这样的方法可以里面添加一些辅助方法,而这些方法默认不给子类开启,除非子类继承了接口 定义的方法,如果在子类继承的接口里面声明的方法刚好定义的相同,那么子类可以不需要再次定义。...可以判断当前自己的类型是否继承了接口 这个方法用在里面期望特定的代码里面给子类暴露一些内部的方法,但是又不能让子类随意调用。...Foo2 里面的 CheckLindexiIsDoubi 用到的属性判断,同时因为子类继承了预期接口而能使用 这就是通过里面定义好方法定义好代码逻辑,只要子类继承接口才能实现

    58820

    Python多态的支持使用

    同样python也支持多态,但是是有限的的支持多态性,主要是因为python变量的使用不用声明,所以不存在父引用指向子类对象的多态体现,同时python不支持重载。...python 多态使用不如Java那么明显,所以python刻意谈到多态的意义不是特别大。  Java多态的体现: ①方法的重载(overload)重写(overwrite)。...②对象的多态性(将子类的对象赋给父的引用)——可以直接应用在抽象接口上 广义上:①方法的重载、重写 ②子类对象的多态性 狭义上:子类对象的多态性(Java,子类的对象可以替代父的对象使用) ...this is father,我重写了父的方法 100 3.关于 super  Python super 是一个 特殊的super() 就是使用 super 创建出来的对象最常 使用的场景就是...目前 Python 3.x 还支持这种方式这种方法 不推荐使用,因为一旦 父发生变化,方法调用位置的 名 同样需要修改 提示  开发时,父 super() 两种方式不要混用如果使用 当前子类名

    71700

    Dart 更好地使用 mixin

    Dart 是一门“纯”面向对象的编程语言,其中所有的对象都是的实例。但是 Dart 并不要求所有代码都定义一个。我们可以一个的外面定义顶级变量、常量、函数 —— 就像面向过程语言那样。...但是, Dart ,如果仅仅是一个函数,定义反而使得代码不好维护。这个时候建议直接使用 typedef 来定义函数别名。...,那么直接定义顶级的常量函数来替换这种方式 Java 或 C#,如果要定义常量的话通常需要定义一个静态常量来做,例如: // Java 代码 public class ConstParams {...比如 Dog 可以继承 Animal ,但是这个也应该限于父足够抽象,没有太多个性化特征,而且未来的改动也极少。 使用继承确实可以减少编码,但是的任何变动都可能导致你的子类代码异常。...建议4:不要使用 implements 实现非接口 接口的定义的好处是可以多种实现方式中切换而无需更改代码,依赖注入型的框架或代码结构中会经常使用面向接口编程的方式。

    2.4K00

    Java的加载机制---父子类的多态调用

    3) 构造的时候,Java机制是到底先给属性分配空间并赋值,还是先处理 构造函数,换句话说,当我们使用new操作符生成一个对象的实例的时候,的加载机制是怎么样的, 如果这三个问题都搞定了,都理解了,...上面的程序就很容易理解为什么输出是null了 Java机制里面有这样的一个原则就是:如果父存在,子类可以不存在;如果子类存在,父必须存在; 怎么理解上面的这句话呢,可以用实际的例子来说明,一个人结婚了但是没有小孩...Java 中子类加载的机制是第三个需要理解的地方: 1)相关的的加载机制还是跟  上面第二点相似,只是子类初始化的时候必须先去初始化父 2)只有 等Java机制给子类所有的父都分配了内存空间之后...;同名方法是多态,只会去调用子类的重载方法, 这个规则说白了,就是当有父子类的时候,必须都所有的存储空间都分配好了,才能执行  属性的初始化,继而是构造函数;同时要明白一点,子类的构造函数是的构造完成之后才会去执行...,栈内存里面放上内容 sub; 10)接下来是去执行子类的构造函数,没有,是默认的无参 整个过程就完整了, 上面的例子最主要的就还是:关于构造函数里面执行多态方法的时候,应该注意的地方

    2.8K40

    【C++】多态 ⑬ ( 多继承应用 “ 抽象 “ | 接口抽象 | C++ 语言中接口实现 | 只定义 纯虚函数 的 抽象接口 | )

    一、多继承应用 " 抽象 " 1、接口抽象 接口 Interface 抽象 AbstractClass 都是 面向对象编程 的重要概念 , 借助它们可以定义一个模板 , 令其他 实现接口...或 继承抽象 模板 , 可实现多态效果 , 这是面向对象最重要的操作 ; Java 语言 , 有 明确的 接口 Interface 抽象 AbstractClass 概念 ; C+...语言中接口实现 C++ 语言中 , 没有接口概念 , 这里使用 " 纯虚函数 " 实现接口 ; 接口特点 : 接口 只有 函数原型 , 没有成员变量 , 函数原型 指的是 函数只有 返回值 函数名... 参数列表 , 没有函数体 ; C++ 接口 有如下要求 : 只能定义纯虚函数 , 该类是一个抽象 ; 不能定义除纯虚函数之外的其它成员 , 如 普通函数 , 成员变量 ; 下面的就是...virtual void pureVirtualFunction() = 0; }; 二、代码示例 - 多继承应用 " 抽象 " C++ , 使用只定义了 纯虚函数 的 抽象 ,

    20820

    【游戏开发】Lua实现面向对象特性——模拟、继承、多态

    不过幸好Lua中有table这样强大的数据结构,利用它再结合元表(metatable),我们便可以很方便地Lua模拟出、继承多态等面向对象编程具有的特性。...三、Lua实现、继承、多态 1.利用Lua实现   面向对象的特性一般都有名,构造方法,成员方法,属性等。...而设置元表__index元方法这一步也是必不可少的,我们需要借助它的查找机制来实现的继承多态等。...子类SubClass,我们可以自由地新增字段子类独有的新方法。而且还可以重定义或者说覆盖/重写父的方法,类似于Java的override,子类覆盖父的虚方法。...四、总结   通过简单地几步,我们就在Lua成功地模拟了、继承多态的特性,这可以给我们程序开发带来了不少的方便。

    2.7K20

    Java 安全使用接口引用

    接口隔离原则 软件编程始终都有一些好的编程规范值得我们的学习:如果你一个多人协作的团队工作,那么模块之间的关系就应该建立接口上,这是降低耦合的最佳方式;如果你是一个SDK 的提供者,暴露给客户端的始终应该是接口...,而不是某个具体实现。...Android 开发我们经常会持有接口的引用,或者注册事件的监听,诸如系统服务的通知,点击事件的回调等,虽不胜枚举,但大部分监听都需要我们去实现一个接口,因此我们今天就拿注册一个回调监听举例:...操作符只有对象引用不为空时才会分派调用 我们接下来分别拿Kotlin Groovy 举例: Kotlin 中使用 ' ?....为了安全使用定义接口中的函数,我做了这个小工具,目前已经开源,所有代码都可以通过github 获取,希望这个避免空指针的“接口救生圈”能够让你在Java 的海洋尽情遨游。

    1.8K20

    派生虚函数非虚函数的继承效果

    ,那就是父的普通函数 而虚函数的作用,主要是为了让父指针可以调用子类的函数,这种是在运行时才决定调用哪个函数 1、虚函数:   C++的虚函数主要作用是“运行时多态”,父中提供虚函数的实现,为子类提供默认的函数实现...子类可以重写父的虚函数实现子类的特殊化。 2、纯虚函数:   C++包含纯虚函数的,被称为是“抽象”。抽象不能使用new出对象,只有实现了这个纯虚函数的子类才能new出对象。   ...C++的纯虚函数更像是“只提供申明,没有实现”,是对子类的约束,是“接口继承”。   C++的纯虚函数也是一种“运行时多态”。...3、普通函数:   普通函数是静态编译的,没有运行时多态,只会根据指针或引用的“字面值”对象,调用自己的普通函数。   普通函数是父为子类提供的“强制实现”。   ...因此,继承关系,子类不应该重写父的普通函数,因为函数的调用至于对象的字面值有关。 参考链接

    8410

    Java 安全使用接口引用

    本文由我的好友 小鄧子 原创投稿 github: https://github.com/SmartDengg/interface-buoy 我使用Java 开发过很多项目,这其中包括一些Web 应用...接口隔离原则 软件编程始终都有一些好的编程规范值得我们的学习:如果你一个多人协作的团队工作,那么模块之间的依赖关系就应该建立接口上,这是降低耦合的最佳方式;如果你是一个SDK 的提供者,暴露给客户端的始终应该是接口...操作符只有对象引用不为空时才会分派调用 接下来分别拿Kotlin Groovy 举例: Kotlin 中使用 ' ?....InterfaceBuoy 则用于创建接口引用的动态代理对象。...为了安全使用定义接口中的函数,我做了这个小工具,目前已经开源,所有代码都可以通过github 获取,希望这个避免空指针的“接口救生圈”能够让你在Java 的海洋尽情遨游。 ~~原文完~~

    1.7K20
    领券