使用表示式樹,讓訪問者直接執行「角色」物件的方法

2021-09-06 09:51:34 字數 2040 閱讀 4985

以前,我們在討論《業務分析三維度(場景+角色+時間)理論》 的軟體設計的時候,對於場景中的訪問者,動態附加場景許可的角色,如何通過訪問者執行角色方法的問題,採用了下面的實現方式:

actor.actas().function(para para);

這種方式本質上是將actor轉換成為了irole介面的例項物件,然後進行方法訪問的,但這樣就暴露了角色物件,比如可以這樣繼續使用:

irole role=actor.actas();

role.fun1();

role.fun2(

"abc

");

這樣看起來的話,role 跟actor 是2個物件了,總覺得有點割裂。

今天,我們使用表示式樹,來實現乙個更優美的方案。

首先定義角色物件和訪問者物件的介面:

public

inte***ce

iactor

}public

inte***ce

irole

}

然後定義乙個動物角色介面,它擁有走路和吃東西的本能方法;

public

inte***ce

ianimal:irole

接著實現乙個動物角色類:

public

class

animal : ianimal

#region ianimal 成員

public

void

move()

move...

",actor.name);

}public

int eat(string

food)

eat..

", actor.name, food);

return1;

}#endregion

}

在實際的角色物件中,它是可以訪問「訪問者」的方法的,比如這裡的actorname

下面,是我們的重點,actor 訪問者類的實現:

class

actor:iactor

public actor(string

name)

public

void

addrole(irole role)

public tresule actas(expression> exp) where t : class

public t getobject() where t : class

return

null

; }

}

我們重點來看actas 方法,它將把自己轉換成指定的角色,然後呼叫角色的方法,但是引數是 expression> ,這就允許我們以非常友好的方式來編碼了,還是看看怎麼呼叫這個**:

actor man = new actor("

zhagnsan");

man.addrole(

new animal());//

為張三新增動物的本能職責

var result=man.actasint>(a => a.eat("

rice

"));

console.writeline(

"result:

",result);

我們在方法裡面,用熟悉的方式,呼叫了動物角色的吃東西方法。

這裡是程式輸出:

zhagnsan eat.rice.

result:

1

相比較文章開頭的方式, 這裡man.actas直接執行了角色物件的方法,而不給外部人員知曉zhangsan 擁有某個角色物件例項的機會,這樣就完成了訪問者對於自己角色更好的「封裝」。也就是,只有自己才可以執行自己角色的方法,這才是符合真實場景的設計

-----------分界線------------------------

歡迎加入pdf.net開源技術團隊,做最好最輕最快的框架!

表示式 使用API建立表示式樹(5)

一 conditionalexpression 表示式 生成如 iif a b a和b相等 a與b不相等 式子。使用 parameterexpression aip1 expression.parameter typeof int a 1 parameterexpression aip2 expre...

表示式 使用API建立表示式樹(3)

一 debuginfoexpression 發出或清除除錯資訊的序列點。這允許偵錯程式在除錯時突出顯示正確的源 static void main string args 執行了下 未經處理的異常 system.reflection.targetinvocationexception 呼叫的目標發生了...

表示式 使用API建立表示式樹(2)

一 blockexpression類 表式乙個包含可在其中定義變數的表示式序列的塊。是一組表示式,類似於多個委託的 後的效果,其返回表示式是最後乙個表示式決定。以下是blockexpression的例子 取自官網中的例子,略改了下 宣告乙個包含有4個表示式的表示式塊。blockexpression ...