在專案中,特別是ui系統,經常需要做乙個ui系統的管理和ui系統初始化,以及ui系統銷毀等情況。
一般有兩種方式來管理ui系統
1.每加乙個系統就在uimanager中加乙個引用。
比如(偽**)
uimanager
uis.add(asystemclass)
類似這樣做,然後用uis來統一管理ui
優點:這樣寫很直觀,在乙個ui系統做完,可以自己管理ui系統初始化順序
缺點:每加乙個系統都需要在這裡修改**,對於開發者的維護成本比較高
2.用c#反射自動獲取相關的類來管理
首先我們會有乙個獲取屬性的基類
public class attributehandler}}
/// /// 註冊訊息處理
///
///
///
protected void registermsghandler(int cmdid, type handler)
", cmdid));
return;
}type pt = new type[0];
object pv = ;
//通過型別陣列獲取對應的型別的構造器
constructorinfo con = handler.getconstructor(pt);
t coninfo = (t)(con.invoke(pv));
"cmdid add : " + cmdid);
mmsghandlers.add(cmdid, coninfo);
}}
當然我們有乙個classenumerator是方便我們列舉出我們所有相關的類的
public class classenumerator
} private type attributetype;
private type inte***cetype;
public classenumerator(
type inattributetype,
type ininte***cetype,
assembly inassembly,
bool bignoreabstract = true,
bool binheritattribute = false,
bool bshouldcrossassembly = false)}
}else
}catch (exception e)
}protected void checkinassembly(
assembly inassembly,
bool binignoreabstract,
bool bininheritattribute
)// debug.log("found type:" + t.fullname + " : " + a.getname());}}
}}}}
}
然後我們可以有乙個uimanager來初始化反射後的資料
public class scenemanager : attributehandler
protected basescene reflectionscene(escenename epaneltype, ref scenehandlerattribute attribute)
}
其中basescene就是我們的ui系統基類
其中reflectionscene方法是用於獲取當前的ui系統的。這其中有乙個沒有說的列舉是escenename ,這裡列舉出來的是所有ui系統。
類似這樣
public enum escenename
然後我需要既然有需要反射的class,那麼我們就需要定義我們的反射屬性才行,也就是上面的scenehandlerattribute
public class handlerattribute :
attribute,
iidentifierattribute }
public handlerattribute(int inmessageid)
}public class scenehandlerattribute :
handlerattribute,
iidentifierattribute }
public string componentname }
public scenehandlerattribute(int inmessageid, string packageurl, string componentname):base(inmessageid)
}
這樣反射才知道要拿什麼還有怎麼從其他class重反射相關引數過管理類來。
最後就是我們真正需要用ui系統反射的地方
[scenehandlerattribute((int)scenedata.escenename.mainscene, "homepackage", "main")]
public class mainscene : basescene
類似這樣,就會把該類放入uimanager中管理以及傳入引數
mmessageid = scenedata.escenename.mainscene;
mpackageurl = 「homepackage」;
mcomponentname = 「main」;
優點:我們不需要手動加**到uimanager了,管理成本低了很多。uimanager統一管理,需要加[scenehandlerattribute((int)scenedata.escenename.mainscene, "homepackage", "main")]這樣的頭部就好了
缺點:1.沒有順序,順序完全是按照dll獲取到的class順序走的,所以ui系統中在初始化時不能有順序依賴。
2.在初始化的時候因為要反射所有類,所以會有乙個搜尋過程,同乙個工程中的類越多就搜尋越久。
C 直接初始化和複製初始化
在c 裡,物件初始化是乙個非常重要但又容易令人混淆的問題。這裡是自己的一些總結。一。初始化與賦值的含義 初始化 包括建立 或說定義 物件並且賦給初值。如果乙個物件只被建立而沒有被初始化,則該變數只能用於被賦值 賦值 擦除物件的當前值並用新值代替。二。內建型別 一 直接初始化 1.空初始化 即無引數無...
c 直接初始化與拷貝初始化
我們常見的幾種初始化的形式 string str1 first 拷貝初始化,編譯器允許把這句話改寫為string str first 但是string類必須有public的拷貝 移動 建構函式 string str2 10,a 直接初始化 string str3 str2 直接初始化 string ...
初始化 指定初始化
id alloc 物件的誕生過程,主要是從作業系統獲得一塊足夠大的記憶體,以存放該類的全部例項變數,並將其指定為存放記憶體物件的實力變數的位置。alloc方法同時將這塊記憶體全部設定為0。結果是 bool變數初始化為no,所有的int型別變數為0,float變數為0.0,所有的指標為nil.obje...