黑马程序员——协议

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

### 黑马程序员 Linux 课程资源 对于希望深入学习 Linux 的用户来说,黑马程序员提供了丰富的 Linux 学习资料和课程。这些资源不仅涵盖了基础概念还涉及高级应用开发和技术实践。 #### 基础入门 Linux 诞生于1991年,由林纳斯·托瓦兹在21岁时完成。此后成为最为流行的服务器操作系统之一[^1]。通过黑马程序员的学习材料,初学者可以从零开始了解这个强大的开源平台,掌握其基本操作命令以及文件系统的结构。 #### 实战技能提升 为了帮助学员更好地理解和运用所学知识,在实战项目环节中会涉及到具体工具和服务配置等内容。例如,可以通过 `ntpd` 服务名配合 `systemctl` 进行控制来实现时间同步功能;这通常需要先执行如下命令安装 NTP 软件: ```bash yum install -y ntp ``` 此过程能够使学生熟悉常见的网络协议及其应用场景,并提高解决实际问题的能力[^2]。 #### 深入理解原理 操作系统作为连接用户与硬件设备之间的重要媒介,扮演着至关重要的角色——它不仅是两者沟通交流的桥梁,更是管理和调度各类计算资源的核心组件。当一台机器装备上了合适版本的操作系统之后,就如同注入了生命一般变得活跃起来[^3]。因此,在黑马程序员提供的进阶教程里也会详细介绍有关进程管理、内存分配等方面的知识点,让参与者更加全面深刻地认识整个体系架构的工作机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值