2009-06-16 109 views
13

在我的應用程序中(如許多其他應用程序中),此實例名稱爲Contact,它代表任何人。在最基本的層面上,這是用來代表業務聯繫人。但它也可以用來代表公司的員工。還有一些特殊類型的員工(假設有一個叫Manager是否有效將對象從基類轉換爲子類

我試圖將此模型作爲一種繼承關係進行建模,這是有道理的。員工的姓名和地址就像聯繫人一樣,還有一些與就業相關的屬性。經理也有一些經理特定的屬性。

當員工晉升爲經理時,就會遇到困難。將基類Employee轉換爲繼承類Manager可以嗎?感覺不對。我想我會用Manager上的專門構造函數來完成它。

NHibernate支持這種行爲呢?就像獲得員工,從員工創建經理,然後保存經理一樣簡單?

回答

5

只要您的商業模式與您的域名匹配,您就可以做正確的事情。

然而,這聽起來像你對我應該是這樣的:

Manager Promote(Employee employee) 
{ 
    var manager = new Manager(); 
    //promote your employee to a manager here 
    return manager; 
} 

某種形式的一些工作流程中。

關於NHibernate,這聽起來像是你的ORM邏輯與你的業務領域混合在一起。將員工晉升爲經理是一個業務領域構造,因此屬於您的業務模型。但是,除了如何映射它們外,NHibernate如何將您的員工和管理人員映射到數據庫中與您的業務模型無關。不過,這絕對與如何向員工推銷員工毫無關係。

+0

NHibernate的問題只是爲了找出NHibernate是否會抱怨將對象作爲基類保存爲子類。 – 2009-06-16 15:19:19

2

我個人會擁有一個包含所有基本事物和角色列表的基類。
每個角色都有自己的屬性和功能。
優點是雙重的:

  • 可以很容易地給予或採取從一個人一個角色/
  • 它將使你的人擁有多個角色,而您不必做「組合類」

如果你去單inherritance與inherritance會很快使你喜歡「ManagerProgrammer」類,「ProgrammerStockManager」,「ProgrammerSupport」

16

我會跟組成投奔inheri在這種情況下。如果你堅持繼承,你將會在每次晉升或降級時改變課程,並且每次你僱用一名聯繫人或一名僱員離開併成爲常規聯繫人。

只說聯繫人具有角色就更簡單了。您可以向聯繫人添加管理員角色以將其提升並刪除角色以將其啓動。

+1

這應該被標記爲正確的答案 – Pierreten 2010-04-23 05:51:18

0

天兒真好,

如果你發現你有一個派生類中從一種類型轉變成另一種派生類型然後就是,最初的設計有問題的氣味。

我的直覺就是你不正確地表示一個Manager對象。

回到基礎並以OO術語思考,您的基類(Contact)包含Employee和Manager對象的公共元素。任何派生的對象都只是基類的特化。

在這種情況下,員工的實例不是經理嗎?

Manager和Employee類都應該有一個也是Employee類型的reportsTo數據成員。

我現在看到的唯一區別是Manager對象現在有一個Employee對象的集合,它們是它們自己的directReports。這應該可以實現爲一個指向Employee對象的容器的指針。

我不能想到需要從Manager對象中分離出Employee對象的行爲中的任何專業化。

嗯,也許使基類包含聯繫人詳細信息的人。

編輯:對不起,從您的評論我猜我不夠清楚。我所描述的不會導致直接從您的Contact類派生的兩個單獨的類,因此您必須在運行時將這個Employee的實例更改爲Manager,這是您的原始問題。

也就是說,我認爲你不應該有兩個派生類,一個Employee和一個Manager,直接從你的Contact類繼承。

這些公司僱用的人不是這兩種情況嗎?爲什麼區分經理和員工?如果員工成爲經理,員工不再是員工嗎?

有兩個派生類,經理和員工,是完全錯誤的恕我直言。你有沒有試過用「isa」和「有一個」關係來解決問題。然後你可以看到你的基本結構是錯誤的。

說一個員工「isa」聯繫只是沒有意義。更有可能員工「isa」Person and Person「有一組」聯繫人詳細信息。

也許派生Manager類作爲員工的專業化?員工「isa」人。經理「isa」「isa」員工。

HTH

歡呼聲,

+0

對不起,這並沒有真正的幫助。你說我不正確地代表一個經理,然後繼續準確地描述我的建議。 – 2009-06-16 15:21:30

+0

對不起。你仍然在描述我已經擁有的東西。來自Contact - > Employee - > Manager的繼承。一個人和一個聯繫人之間的語義差異是相互關聯的。問題在於這種繼承,可以將員工轉換爲員工的子類(經理)。 – 2009-06-22 09:20:20

2

是的,它是有效的。在關於實施,你可以使用:對經理

  • 靜態方法:對經理public static Manager Promote(Employee employee) { ... }
  • 專門構造
  • 廠或服務類

我認爲,任何這些方法將是一個不錯的解。就我個人而言,我喜歡專業的構造器解決方案,因爲它代表了現實世界:您正在從現有的員工創建一個新的管理器。

0

聯繫人是Employee的一個屬性。工人(你的員工)是一個角色,經理是一個角色。工人和經理都是員工,但具有角色。角色是IS IN關係,Employee是AM A關係,Contact是HAS A關係。 員工有一個聯繫(1-1關係)每個員工一個聯繫(1-M,如果他們有兩個電話等但我離題) 員工是在角色(MM關係)許多員工很多角色 員工是一個(M-1關係) - 許多員工,所有員工類型。

所以你正在改變角色。