在我們開始Crest的設計之前,我們先看一段參考代碼
using System;
using System.Collections.Generic;
public abstract class Bird{
protected String name;
public abstract String tweet();
public String getName(){return name;}
}
public class Cock : Bird{
public override String tweet(){return "woooooo";}
public virtual String walk(){return "cock walk";}
public void setName(String newName){ name = newName;}
}
public class MainClass
{
public static void Main()
{
Bird bird = new Cock();
Cock cock = new Cock();
System.Console.WriteLine(bird.tweet());
}
}
這是一段純正的面向對象的代碼,我們的話題就會沿著這一段代碼展開。首先我們從設計Crest以支持最簡單的對象。
因為C語言的本身限制,所以我們要模擬一個類的定義只能使用struct。最簡單的類當然就是空類了。我們的C代碼如下:
struct CEmptyObject
{
}
然後我們要讓我們的CEmptyObject類加入成員變量,也很簡單:
struct CEmptyObject
{
int salary;
};
再加入一個成員函數吧。我想加入一個getSalary,但是問題來了,怎麼加呢?如果這樣寫:
int getSalary(){return salary;}
似乎是對的,但是C編譯器報告salary找不到,如果把這行代碼放到struct CEmptyObject中,同樣也是編譯錯誤[BCC32 Error] raw.c(143): E2200 Functions may not be part of a struct or union。實際上,大部分OO語言的實現都是類似的,我們也就不賣關子了,照搬如下:
int getSalary(struct CEmptyObject * _this)
{
return _this->salary;
}
所有我們代碼中寫的 xxx.getSalary() 類似的代碼,都實際轉化為getSalary(xxx)形式,如果大家熟悉C#的擴展函數,就更明白這一點。
設計好了簡單對象,我們當然要用一下了,先看