三大特性_多态

本文介绍了多态的概念及其在编程中的应用。通过实例演示了多态如何简化代码,并讨论了其限制,例如父类无法直接调用子类特有的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多态:

多态的好处和限制:
调用:
若还有一个喂动物的函数:
void feed(Animal *a){
[a eat];//eat方法在之前的Animal类中已经声明并实现
}

int main(){
——Animal *a=[Cat new];//可以,Cat是Animal
——Cat *c1=[Cat new];//可以
——Cat *c2=[Dog new];//不可以,Dog并不是Cat
——//[c2 eat]编译的时候是警告,运行时动态监测对象的真实类型,返回的是Dog在吃

——NSObject *o1=[Cat new];//可以
——NSObject *o2=[Animal new];//可以
——NSString *s=[Cat new];//不合理,但由于OC是若语法,xcode并不报错,一定要注意

——//如果参数中是父类类型,则可以传入父类或子类类型
——feed(a);
——feed(c1);
——feed(c2);//这就是多态的好处,可以节省代码

——//多态的限制:
——Animal *a2=[Cat new];
——[a2 run];//Cat有一个run跑的方法。程序在编译的时候会warning,因为父类不能调用子类的方法。运行没问题。
}

### 面向对象编程中的多态特性 #### 什么是多态多态是指同一操作作用于不同的对象,可以有不同的解释,从而产生不同的执行结果[^1]。它是一种重要的面向对象特性,能够提高代码的灵活性和可扩展性。 #### 多态的表现形式 多态主要分为两种表现形式:静态多态(编译时多态)和动态多态(运行时多态)。 - **静态多态** 静态多态通常通过函数重载或运算符重载实现,在编译阶段就已经确定了具体的操作行为[^2]。例如,同一个方法名可以通过接受不同类型的参数来表现出多种形态。 - **动态多态** 动态多态则是在程序运行期间根据对象的实际类型决定调用哪个方法,这种机制依赖于继承和虚方法/抽象方法的支持[^4]。当子类覆盖父类的方法时,即使变量声明为父类类型,也会调用子类中定义的具体实现。 #### 实现多态的关键条件 要实现多态,需满足以下几个前提条件: 1. 存在一个继承关系; 2. 方法被重新定义 (Override),即子类提供了与父类同签名但功能可能有所差异的新版本; 3. 使用父类引用指向子类实例的对象[^5]。 #### 示例代码展示 以下是基于 Java 的简单例子展示了如何利用继承以及方法覆写达成基本的多态效果: ```java // 定义一个动物基类 class Animal { public void makeSound() { System.out.println("Some generic animal sound"); } } // 创建狗类作为动物的一个特定种类 class Dog extends Animal { @Override public void makeSound() { System.out.println("Woof woof!"); } } // 创建猫类作为另一个具体的动物类别 class Cat extends Animal { @Override public void makeSound() { System.out.println("Meow meow!"); } } public class PolymorphismExample { public static void main(String[] args) { // 将不同类型赋给相同的数据类型(Animal) Animal myDog = new Dog(); Animal myCat = new Cat(); // 调用各自特有的发声动作 myDog.makeSound(); // 输出 Woof woof! myCat.makeSound(); // 输出 Meow meow! // 即使都是animal类型,但是由于实际创建的是dog/cat所以会分别打印对应的声音 } } ``` 此段代码清晰地体现了动态绑定的概念,其中`myDog` 和 `myCat` 变量虽然都属于 `Animal` 类型,但由于它们实际上分别是 `Dog` 或者 `Cat` 对象,因此最终执行的结果取决于各自的类定义。 #### 多态的优势 采用多态技术有诸多好处,包括但不限于以下几点: - 提升代码复用率,减少重复劳动[^3]; - 方便后续维护与升级,增强系统的开放封闭原则适应能力; - 让应用程序更加灵活易变,面对需求变化能迅速调整策略而不必修改原有逻辑结构. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值