Java和Objective-C
iOS中有个概念「Protocol」,好多教科书或者Blog都说是Java中的接口,当时我看到的时候,只有C++的经验,心想尼玛接口是什么。。。。
后来学习Java的时候接触到一个概念「面向接口编程」,接口(Interface)这个单词怎么看着这么眼熟呢?原来OC的头文件里就是这个词啊。。
//Java的java文件
public interface BaseObject {}
//OC的Head文件
@interface BaseObject : NSObject
@end
虽然两个都称作「Interface」但是功能范围完全不一样,但是总体都遵循了一个思想『面向接口编程』
**定论:**功能上来讲 Java的Interface = OC的Interface + OC的Protocol
Interface不同的概念
多实现和单实现
具体的过程请参面向对象语言的吹逼,
- Java的Interface本身就是一个类,所以接口与接口之间可以进行继承,且一个接口可以有多个实现
- Objective-C的的Interface也是一个类,但是一个接口只能有一个实现
所以才说两种语言都是一种「面向接口编程」的语言,你可以拿一个接口指向一个实现,并对其进行操作。
//Java
//定义了一个List接口且继承于另外一个Collection接口
public interface List<E> extends Collection<E> {}
//定义了一个类实现了List接口
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable {}
//拿一个接口指向一个实例化
List list = new ArrayList<>();
//Objective-C
//定义了一个BaseObject接口(其实是个类)
@interface BaseObject : NSObject
@end
//实现了BaseObject接口
@implementation BaseObject
@end
//拿一个接口(类定义)指向一个实例化
BaseObject *baseObject = [[BaseObject alloc]init];
多实现和多遵守
由于Java和Object-C都是单继承的语言,所以说要实现多个多态时,就出现了类似的多实现和多遵守
//Class文件中在implements中添加多个Interface
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable {}
//在.m文件中再次声明一次interface了BaseObject接口,然后通过<>遵守多个Protocol
@interface BaseObject : NSObject <UITextFieldDelegate,PGTextFieldDelegate,UIAlertViewDelegate>
@end
@implementation BaseObject
@end
谁可以当指针
根据多实现和单实现的来看,谁可以当指针呢
//Java
//本身当指针
ArrayList arrayList = new ArrayList<>();
//某个父类当指针
Object object = new ArrayList<>();
//某个接口当指针
List list = new ArrayList<>();
Serializable serializable = new ArrayList<>();
//Objective-C
//某个父类当指针
NSObject *object = [[BaseObject alloc]init];
//本身当指针
BaseObject *baseObject = [[BaseObject alloc]init];
//Protocol 不能当指针 但是可以使用模版类id加上遵守某个协议
//代表指向任意遵守协议UITextFieldDelegate类型的对象
id<UITextFieldDelegate> basePoint = [[BaseObject alloc]init];
有趣的是在OC里的id显示其Class是「T」,其相当于Java中的T模板感觉上
总结
由上可知,虽然都是「面向接口编程」但是
- Java的Interface本身就是类,而OC的Interface是类的定义
- Java的Implements是多态的实现,而OC的Implementation是类的实现
- Java的Implements等同于OC中对协议的遵守