张运涛

c++

   :: 首页 :: 联系 :: 聚合  :: 管理

常用链接

留言簿(4)

搜索

  •  

最新评论

从 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. 不支持重载

posted on 2010-07-17 10:26 张运涛 阅读(632) 评论(0)  编辑 收藏 引用 所属分类: iphone

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理