多態(tài)
一.多態(tài)與類的消息(方法)機(jī)制
指同一個(gè)消息(方法)根據(jù)發(fā)送的對象不同携悯,而采用不同的行為方式
//因?yàn)槠渌惗际抢^承父類的 我們要添加方法也只是再父類那里添加方法获询,所以不會(huì)對其他類產(chǎn)生影響,因?yàn)楦割惖姆椒ǎㄏⅲ┳宇悙塾貌挥媚穑瑳]什么影響
- 擴(kuò)充性 我們添加方法不會(huì)影響其他類
//我們要調(diào)用同一個(gè)功能冯凹,而這個(gè)功能有很多對象來進(jìn)行的,我們可以把他們的父類弄成某個(gè)類的成員變量炒嘲,再在實(shí)現(xiàn)的時(shí)候宇姚,我們只需傳入某個(gè)子類的指針對象,就可以調(diào)用子類相對應(yīng)得方法夫凸,從而產(chǎn)生不同的反應(yīng).
- 接口性 把功能封裝
// 這樣可以省略好多接口 比如:有很多動(dòng)物繼承animal 你難道也要像上面一樣寫這么多嗎浑劳?用下面的方法 就只要寫一條語句 這就是繼承多態(tài)的好處
申明的地方
- (void) feedAnimal:(Animal *)animal
實(shí)現(xiàn)的地方
//這里就是 傳入一個(gè)對象 你想誰來吃 就讓誰來調(diào)用 然后實(shí)現(xiàn)他的方法 - (void) feedAnimal:(Animal *)animal{
[animal eat];
}
//比如某個(gè)子類的反應(yīng)(也就是方法里面的內(nèi)容)要修改 只需改子類里面的東西就可以
- 簡化性 每個(gè)類都有一個(gè)功能,一個(gè)有功能有問題夭拌,只需要找到這個(gè)類去修改
【多態(tài)要求滿足三個(gè)條件】繼承(init)魔熏,重寫,父類引用指向子類對象
//其實(shí)多態(tài)就是指鸽扁,同一個(gè)接口不同的實(shí)現(xiàn)蒜绽。
【注】OC的成員方法采用消息機(jī)制,因此都是虛函數(shù)桶现。
// 見多態(tài)Demo
【虛方法】
1.父類的指針躲雅,可以指向子類的對象。
2.響應(yīng)消息骡和,不看指針相赁,看對象。
【注】虛方法體現(xiàn)了不同事物被同一事件觸發(fā)慰于,有不同的響應(yīng)钮科。
毆打小動(dòng)物
有兩種小動(dòng)物,Lavra BlackBug婆赠,一個(gè)人去打他們跺嗽,他們做出不同的反應(yīng)
4.謝霆鋒的家長問孩子是誰的?
張柏芝:謝霆鋒的
謝霆鋒:陳冠希的
陳冠希:反正張柏芝的
- (void)answer;
#import <Foundation/Foundation.h>
#import "Animal.h"
#import "Dog.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 不要看指針類型,因?yàn)轫憫?yīng)消息的是對象页藻,看消息發(fā)送給哪個(gè)對象
// 這種不看指針,看對象的方法調(diào)用 叫做虛函數(shù)
// 父類類型的指針可以指向子類對象
Animal *ani = [[Dog alloc] init];
[ani jump];//Dog can jump 10m
}
return 0;
}
#import <Foundation/Foundation.h>
@interface Animal : NSObject
- (void)jump;
@end
#import "Animal.h"
@implementation Animal
- (void)jump
{
NSLog(@"Animal can jump 3m");
}
@end
#import "Animal.h"
@interface Dog : Animal
@end
#import "Dog.h"
@implementation Dog
- (void)jump
{
NSLog(@"Dog can jump 10m");
}
@end
家長問
#import <Foundation/Foundation.h>
#import "Parent.h"
#import "ZhangBoZhi.h"
#import "XieTingFeng.h"
#import "ChenGuanXi.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 1. 獲取家長
Parent *xieXian = [[Parent alloc] init];
// 2. 獲取張柏芝
ZhangBoZhi *zbz = [[ZhangBoZhi alloc] init];
// 3. 獲取謝霆鋒
XieTingFeng *xtf = [[XieTingFeng alloc] init];
// 4. 獲取陳冠希
ChenGuanXi *cgx = [[ChenGuanXi alloc] init];
// 5.家長問
[xieXian askParty:zbz];
[xieXian askParty:xtf];
[xieXian askParty:cgx];
}
return 0;
}
#import <Foundation/Foundation.h>
#import "Party.h"
@interface Parent : NSObject
- (void)askParty:(Party *)party;
@end
#import "Parent.h"
@implementation Parent
- (void)askParty:(Party *)party
{
[party answer];
}
@end
#import <Foundation/Foundation.h>
@interface Party : NSObject
- (void)answer;
@end
#import "Party.h"
@implementation Party
- (void)answer
{
}
@end
#import "Party.h"
@interface ZhangBoZhi : Party
@end
import "ZhangBoZhi.h"
@implementation ZhangBoZhi
- (void)answer
{
NSLog(@"謝霆鋒的");
}
@end
import "Party.h"
@interface XieTingFeng : Party
@end
import "XieTingFeng.h"
@implementation XieTingFeng
- (void)answer
{
NSLog(@"陳冠希的");
}
@end
import "Party.h"
@interface ChenGuanXi : Party
@end
import "ChenGuanXi.h"
@implementation ChenGuanXi
- (void)answer
{
NSLog(@"反正張柏芝的");
}
@end
#isMemberOfClass和isKindOfClass的區(qū)別
import <Foundation/Foundation.h>
import "Animal.h"
import "Dog.h"
import "HaShiQi.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Animal *animal = [[Animal alloc] init];
Dog *dog = [[Dog alloc] init];
HaShiQi *haShiQi = [[HaShiQi alloc] init];
//isMemberOfClass
// 判斷是否這個(gè)類的實(shí)例
if ([dog isMemberOfClass:[Animal class]]) {
NSLog(@"dog 是Animal的實(shí)例");
}
if ([dog isMemberOfClass:[Dog class]]) {
NSLog(@"dog 是Dog的實(shí)例");
}
if ([dog isMemberOfClass:[HaShiQi class]]) {
NSLog(@"dog 是HaShiQi的實(shí)例");
}
// 判斷對象是否是Animal這個(gè)類或者Animal這個(gè)類子類的實(shí)例
if ([haShiQi isKindOfClass:[Animal class]]) {
NSLog(@"haShiQi 是Animal的實(shí)例");
}
if ([haShiQi isKindOfClass:[Dog class]]) {
NSLog(@"haShiQi 是Dog的實(shí)例");
}
if ([haShiQi isKindOfClass:[HaShiQi class]]) {
NSLog(@"haShiQi 是HaShiQi的實(shí)例");
}
}
return 0;
}
import <Foundation/Foundation.h>
@interface Animal : NSObject
@end
import "Animal.h"
@implementation Animal
@end
import "Animal.h"
@interface Dog : Animal
@end
import "Dog.h"
@implementation Dog
@end
import "Dog.h"
@interface HaShiQi : Dog
@end
import "HaShiQi.h"
@implementation HaShiQi
@end
#毆打動(dòng)物多態(tài)案列
import <Foundation/Foundation.h>
import "Lavra.h"
import "BlackBug.h"
import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 1. 獲取人這個(gè)對象
Person *person = [[Person alloc] init];
// 2. Lavra對象
Lavra *lavra = [[Lavra alloc] init];
// 3. BlackBug 對象
BlackBug *blackBug = [[BlackBug alloc] init];
// 4. 人去打蟲子
// [person hitAnimalWithLavra:lavra];
// [person hitAnimalWithBlackBug:blackBug];
[person hitAnimal:blackBug];
}
return 0;
}
import <Foundation/Foundation.h>
import "Lavra.h"
import "BlackBug.h"
import "Animal.h"
@interface Person : NSObject
- (void)hitAnimal:(Animal *)ani;
//- (void)hitAnimalWithLavra:(Lavra *)lavra;
//- (void)hitAnimalWithBlackBug:(BlackBug *)blackBug;
@end
import "Person.h"
@implementation Person
- (void)hitAnimal:(Animal *)ani
{
[ani react];
}
//- (void)hitAnimalWithBlackBug:(BlackBug *)blackBug
//{
// [blackBug react];
//}
//
//- (void)hitAnimalWithLavra:(Lavra *)lavra
//{
// [lavra react];
//}
@end
import <Foundation/Foundation.h>
@interface Animal : NSObject
- (void)react;
@end
import "Animal.h"
@implementation Animal
- (void)react
{
}
@end
import "Animal.h"
@interface Lavra : Animal
@end
import "Lavra.h"
@implementation Lavra
- (void)react{
NSLog(@"嚇?biāo)缹殞毩?);
}
@end
import "Animal.h"
@interface BlackBug : Animal
@end
import "BlackBug.h"
@implementation BlackBug
- (void)react
{
NSLog(@"把人揍了一頓");
}
@end