从 C/C++ 语言到 Objective-C 语言
一.类的定义部分
// C++ Class
#include "BaseClass.h"
class MyClass : public BaseClass
{
public:
//构造,析构函数.
MyClass();
virtual ~MyClass();
//属性设置函数
virtual int GetValue() const;
virtual void SetValue(int inValue);
//数据交验函数
bool IsValid(int inValue) const;
//得到实例
static MyClass* GetInstance();
private:
int mValue;
static MyClass* sInstance;
};
// Object-C Class
#import "BaseClass.h"
@interface MyClass : BaseClass
{
int mValue;
}
//属性设置函数
- (int) getValue;
- (void) setValue: (int) inValue;
//数据交验函数
- (BOOL) isValid;
+ (MyClass*) getInstance;
@end
注:
1.用#import取代了#include.#import 相当于 C/C++ 语言中的 #include+#pragma once。当头文件嵌套包含的时候,它的作用就发挥出来了。
2.类中没有构造和析构函数
3.成员变量/函数没有限定符,且成员变量默认为private,成员函数默认为public.
4.没有const 与 virtual 关键字,且函数缺省就是virtual的。
5.类继续的时候没有限定符,且继承都是公有继承。所有继承都是单继承.
6.如果想实现多重继承,可以只用类似Java 中 implements 的方法。(Objective-C 中叫做 protocol).
二.类的实现部分
//实现部分:
MyClass* MyClass::sInstance = NULL;
//析构怀构造函数
MyClass::MyClass():mValue(0)
{
}
MyClass::~MyClass()
{
mValue=-1;
}
//属性设置函数
int MyClass::GetValue()const
{
return mValue;
}
void MyClass::SetValue(int inValue)
{
assert(IsValid(inValue));
mValue=inValue;
}
bool MyClass::IsValid(int inValue)const
{
return (0 <= inValue && inValue <= 1000);
}
//得到实例函数
MyClass* MyClass::GetInstance()
{
if (sInstance==NULL)
{
sInstance=new MyClass();
}
return sInstance;
}
void main()
{
MyClass* p=MyClass::GetInstance();
p->SetValue(500);
cout<<p->GetValue()<<endl;
}
//In Object-C
static MyClass* sInstance = 0;
@implementation MyClass
- (int) getValue
{
return (mValue);
}
- (void) setValue: (int) inValue
{
NSParameterAssert([self isValid]);
mValue = inValue;
}
- (BOOL) isValid
{
return (0 <= inValue && inValue <= 1000);
}
+ (MyClass*) getInstance
{
if (sInstance == 0)
{
sInstance = [MyClass alloc];
}
return (sInstance);
}
@end
注:
1.实例方法: 方法前面的“-”是实例方法(类似于C++中的类成员函数)。
2.类方法: 前缀为“+”的是类方法(类似于C++中的静态成员函数,或者是全局函数)
3.类变量: 与C/C++语言中的静态变量一样,Objective-C 中的类变量就是以 static 声明的变量。(只在当前定义文件中有效)
4.如果子类也想参照父类中的类变量的时候,须定义属性参照方法(类方法)。(这与面向对象中的封装概念有所背驰,降低了凝聚度)
类设计小结:
1. 头文件依然是.h,但实现文件从 .cpp变成了.m.
2. #import代替了#include,#import保证只会引用一次,相当于.h里的#ifndef #define #endif模式
3. 用@interface … @end来声明类,取代class ClassName{}
4. 用@implementation … @end来实现类
5. Data Members放在@interface ClassName : Parent{ … }中,默认权限为@protected,在ObjC里称为Instance Variables
6. Member Functions放在@interface ClassName: Parent{} … @end中,在ObjC里称为Instance Methods
7. Instance Methods的声明方式为:scope (returnType) methodName: (parameter1Type) parameter1Name;
8. scope分instance和class两种,分别用-和+表示
9. 调用method的方式是[Object method],相当于Object-> method()
10. 带参数调用method的方式是[Object method: parameter]
11. 没有Object,只有Pointer to Object
12. 通常的构造方式: Object * obj = [[Object alloc] init]
13. 析构的方式:[obj release]
14.多参数method的声明方式: scope (returnType) methodName: (parameter1Type) parameter1Name label1Name: (parameter2Type) parameter2Name … ;
15. labelName不是必须的
16. 这种特别的语法源自SmallTalk
17. private: [list of vars] protected: [list of vars] public: [list of vars] 改成了@private, @protected, @public
18. Class Variable用static的方法实现.
19. +(void) initialize 会在构造的时候被调用
20. ObjC通常用@符号表示语言的衍生部分
22. ObjC用id来表示范型对象的指针
23. 支持动态类型识别,即RTTI.
24. Categories机制可用于不继承已有class的前提下加入新功能
25. Posing机制允许Child取代Parent
26. Protocol相当于pure virtual class
27. ObjC由两种内存管理的方法,1) retain and release,2) retain and release/autorelease
28. Foundation相当于STL,NSArray对应vector,NSDictionary对应map
29. ObjC不支持Namespace
30. 不支持重载