簡體   English   中英

將對象的類更改為子類(以及有關繼承的一般問題)

[英]Changing class of object to subclass (& general questions on inheritance)

假設我有一個clubMember和一個班級user 只有俱樂部會員才能成為用戶,用戶具有其他俱樂部會員var之外的登錄數據,並且俱樂部會員的特征會影響他們擁有的用戶的權限,因此user擴展clubMember

現在,假設一個俱樂部成員想使用我當前正在編程的grails servlet。 創建一個新的user實例將導致重復輸入,加上我將丟失先前成員與其他類之間現有的所有鏈接。 那么也許將clubMember的類型轉換為user將是進行操作的最佳方法嗎? 如果是這樣,那怎么做(在Groovy中)?

或者,您可以向我推薦除子類之外的一種實現方法嗎? 理想情況下,“列出所有成員”之類的請求也應返回用戶,即使子類也是如此? (編輯:我的grails應用程序就是這種情況)

相關: Java:從父對象創建子類對象 ,將對象從基類轉換為子類是否有效?

如果您希望某種類型的值變成另一種類型的新值,那么在Groovy中基本上有兩種方法:

  1. asType:例如,在“ foo as Bar”中,Groovy會將表達式轉換為“ foo.asType(Bar.class)”,這意味着您可以將asType方法添加到foo類中以為您進行轉換。 在您的情況下,您可以將asType添加到User,並讓其處理ClubMember。
  2. 顯式或隱式強制轉換:在“(Bar)集合”中,Groovy將在Bar中尋找一個構造函數,該構造函數可以為該集合采用適當數量的參數,然后從中構造一個新的Bar對象。 實際上,它不僅限於集合,數組也可以。 無論如何...在您的示例中,您可以添加一個將ClubMember用作User的構造函數,然后轉換包含要轉換的成員的集合。 在側節點上...如果將集合分配給Bar類型的變量,則也會發生這種轉換(隱式轉換)。

如果您不希望在類中使用轉換方法(我很自由,也將構造函數也稱為轉換方法),則仍可以使用asType版本的類別或運行時元編程來根據需要添加asType方法或您需要的構造函數。

但是蒂姆在評論中建議讓ClubMember成為User成員似乎確實是最簡單的版本

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM