黑马程序员——协议

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1.什么是协议
(1)现实生活中的协议
    就业协议,贷款协议,劳动合同,结婚协议
    特点:归定了双方必须完成的事情
(2)协议的总结
    计算机中:设备和要和计算机通信
    什么是协议:协议是制定一个接口,为了满足统一数据和信息传递的需求
2.协议的基本语法
(1)编程中为什么需要协议-------------核心
       A对象要给B对象发送消息
       B对象想要知道A对象给他发送什么消息
       通过协议制定接口,告诉B对象会给他发送什么样的消息
       A对象担心B对象无法响应这个消息,通过协议规定B 对象必须实现的方法
(2)协议的语法
实例:协议最简单的用法
        需求:Test类
        想要给Test发送一个消息length,担心Test无法响应
        思路:使用协议
        <1>制定协议
        <2>遵守协议
        <3>执行协议(实现协议中的方法)
        细节:一般情况下 A类指定指定协议 B类遵守协议和实现协议中的方法
#import <Foundation/Foundation.h>
 #import "Test.h"
 int main(int argc, const char * argv[])
 {
        @autoreleasepool {
      
                id test=[[Test alloc] init];
                //假设:系统给自己写的类Test发送消息
                int l=(int)[test length];
                NSLog(@"%d",l);
   }
    return 0;
}
#import <Foundation/Foundation.h>
//@protocol表示制定了一个协议
//SystemDelegate表示协议的名字
//编程规范:如果类名是system ,那么类定义的协议一般为 SystemDelegate
//<NSObject>
//类名或者协议名加上<>表示遵守协议
//注意:此处为NSObject 它是一个协议
@protocol SystemDelegate <NSObject>
//在协议中添加让遵守协议的类必须要实现的方法声明
-(int)length;
@end
#import <Foundation/Foundation.h>
//让test类遵守协议
//遵守协议的效果:
//如果一个类遵守了某个协议:没有实现协议中必须实现的方法,系统会报警,提示协议中的方法没有实现
#import "SystemDelegate.h"//加上头文件
@interface Test : NSObject  <SystemDelegate>
//类名的后面加上<SystemDelegate>表示遵守了SystemDelegate协议
@end
#import "Test.h"
@implementation Test
-(int)length
{
    return 1000;
}
@end

3.协议的例子-----不同对象的排序-----核心心
需求:输出这些对象
不管是神马对象都用printIformation方法输出
 问题:dog没有printInformation程序方法
 解决:通过协议让dog类和person类都实现这个方法
 <1>制定协议(协议添加方法声明)
 <2>遵守协议
 <3>执行协议
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Dog.h"
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        Dog *momo=[[Dog alloc] init];
        momo.nickname = @"momo";
        momo.price = 1000;
        
        Dog *yaoyao=[[Dog alloc] init];
        yaoyao.nickname = @"yaoyao";
        yaoyao.price = 2000;
        
        Person *lilei = [[Person alloc] init];
        lilei.name = @"lilei";
        lilei.age = 23;
        
        Person *wanglei = [[Person alloc] init];
        wanglei.name = @"wanglei";
        wanglei.age = 24;
        
        Person *naicha=[[Person alloc] init];
        naicha.name=@"naichameimei";
        naicha.age=20;
        
        NSArray *arr=@[momo,yaoyao,lilei,wanglei,naicha];
       
        for (id obj in arr) {
            //[obj printInformation];
        }
        //<2>数组中包含不同的对象
        //  需求:需要对这些对象进行排序
        //    按照名字升序排序
        NSMutableArray *marr=[[NSMutableArray alloc] initWithArray:arr];
        [marr sortUsingSelector:@selector(myComepare:)];
        for (id obj in marr) {
            [obj printInformation];
        }
    }
    return 0;
}
#import <Foundation/Foundation.h>
@protocol CommomDelegate <NSObject>
//用于输出
-(void)printInformation;
//用于比较
//不同的对象比较(人和狗)
-(int)myComepare:(id)obj;
//为了使用统一的接口获取名字
-(NSString *)name;
@end
#import <Foundation/Foundation.h>
#import "CommomDelegate.h"
@interface Dog : NSObject<CommomDelegate>
@property (copy,getter = name)NSString *nickname;
@property int price;
-(int)myComepare:(id)obj;
@end
#import "Dog.h"
@implementation Dog
-(void)printInformation
{
    NSLog(@"name=%@,age=%d",_nickname,_price);
}
-(int)myComepare:(id)obj;
{
    int r=[self.nickname compare:[obj name]];
    return r>0;
}
@end
#import <Foundation/Foundation.h>
#import "CommomDelegate.h"
@interface Person : NSObject<CommomDelegate>
@property (copy)NSString *name;
@property int age;
//重写方法,或者实现协议中的的时候不需要
//-(void)printInformation;
@end
#import "Person.h"
@implementation Person
-(void)printInformation
{
    NSLog(@"name=%@,age=%d",_name,_age);
}
//-(int)myComepare:(id)obj  //id方法不能用点语法调用 但是可以用下面的 方法实现调用
-(int)myComepare:(id<CommomDelegate>)obj
{
    //当前类是person类
    //用self.name取
    
    //存在的问题:obj可能是Dog可能是Person
    //          获取名称的时候使用的方法不一样
    //int r=[self.name compare:[obj name]];
    int r=[self.name compare:obj.name];

    //如果r>0,则前面字符串大,需要交换
    return r>0;
}
@end
4.可选方法和必选协议
#import <Foundation/Foundation.h>
@protocol CommomDelegate <NSObject>
//表示下面的方法必须实现
//细节:默认是@repuired,是必须实现的
@required

//用于输出
-(void)printInformation;
//用于比较
//不同的对象比较(人和狗)
-(int)myComepare:(id)obj;
//为了使用统一的接口获取名字
-(NSString *)name;
@optional//可选的  意味着可以实现或者可以不实现
-(void)opt;
@end

5.协议扩展

1.类能否多继承?---单继承
    一个类可以遵守多个协议

2.协议中的方法是否必须实现
    如果是可选的方法可以不实现,没有任何问题
    如果是必选的方法,如果不实现编译有警告,运行的时候可能崩溃

黑马程序员的tb_brand是指在JavaWeb基础教程中创建的一个表。这个表是用来存储品牌信息的,具体的表结构和数据类型需要和JavaBean类中的成员变量保持一致。\[1\]在这个教程中,使用了Maven来构建项目,并且使用了MyBatis作为持久层框架,通过配置pom.xml文件来引入相关依赖。\[2\] Maven是一个用于管理和构建Java项目的工具,它提供了一套标准化的项目结构、构建流程和依赖管理机制。\[3\] #### 引用[.reference_title] - *1* [【JAVAWEB开发】黑马程序员java web案例资料(含Element的删除与修改)](https://blog.csdn.net/aasd23/article/details/126940147)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [黑马程序员-MyBatis 框架-最全入门笔记、阿伟看了都得真大、真细、真全!!!](https://blog.csdn.net/qq_57383364/article/details/128103058)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [JavaWeb——黑马程序员课程笔记](https://blog.csdn.net/King_ZACC/article/details/128573804)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值