[英]Custom Collection and Inherited Class Types
我遇到了困難,可能缺少一些簡單的東西,即對集合中的項目進行排隊和取消排隊。
我有各種繼承級別的類:
public abstract class Item
{ //stuff }
public class DetailItem : Item
{ //stuff }
public class SuperDetailItem : DetailItem
{ //stuff }
public class OddItem : Item
{ //stuff }
然后,我有一個ConcurrentQueue<T>
像這樣:
public class CQItems<Item> : ConcurrentQueue<Item>
{ //some methods }
其中一種方法是在調用時添加項目,因此我會執行以下操作:
CQItems<Item> items = new CQItems<Item>();
items.Generate(i);
它將在隊列中創建i
項目。 盡管目前我在指定創建DetailItem
項目的方法中有效,但我希望這種方法也是動態的,但這將是一個不同的問題。 因此,稍后,我致電獲取DetailItem
,如下所示:
DetailItem item;
items.TryDequeue(out item);
並收到消息“無法從DetailItem轉換為Item”。
我不想為每個繼承的類型做一個特定的集合。 我想念哪一塊? 謝謝!
編輯:更新以獲取其他信息。 將Item
為Interface
並對其進行修復,以便在該接口的第一IItem
中定義通用方法並不能解決問題,甚至不能使該集合成為IItem
類型的IItem
。
我在這里添加一些細節,以防萬一我完全以錯誤的方式來處理這個問題。 該軟件是用於處理銀行業務的其他軟件的質量檢查工具。 項目可以是Cash : Item
(或IItem
), Check: Base
, ReturnCheck : Check
和其他一些。 每個后代都有一些其他對象不需要攜帶的類對象需要攜帶的其他信息。 有些還需要其父類不需要的方法。 這就是為什么我不想只使用一個包含所有元素的類和一個用於類型的Enum
的原因-不同的項目將需要進行不同的驗證和不同的使用。 例如,當Item
是虛擬的而不是接口時,它具有字段Amount
。 這是所有子孫后代永遠擁有的唯一領域。
在某些情況下,我希望集合類包含一些CheckItem
對象和一些CashItem
對象。 在這些情況下,從隊列中提取項目的代碼將評估項目的類型並對其進行相應的處理,並將適當的信息提供給調用函數。
當前,無論是virtual
實現還是interface
實現,它都知道…… CheckItem
。 但是由於基類沒有用於“ CheckNo”的字段,因此當我只執行item.CheckNo
,它表示Item
基類沒有該字段(不,它沒有)。
目前,我正在通過以下方式進行工作:
IItem _item;
CheckItem item;
items.TryDequeue(out _item);
item = _item as CheckItem;
如果一次在集合中只有一種類型的對象,那就太好了。 這是我不能做的事情,還是我處理方法不正確?
首先,您創建一個應該存儲Item
元素的隊列。
CQItems<Item> items = new CQItems<Item>();
然后,您說:取自您擁有的Item
任何具體類型,並將其分配給DetailItem變量:
DetailItem item;
items.TryDequeue(out item);
TryDequeue
通過out
修飾符“返回”一個Item
。 基本上就像嘗試將Item
分配給DetailedItem
一樣,這是相同的:
Item item = GetItem();
DetailedItem detailedItem = item; // compilation error
這顯然是沒有道理的。
TryDequeue
的“ Try”部分對應於空隊列 ,而不是強制轉換。
您可能想做的是:
Item item;
items.TryDequeue(out item);
if (item is DetailItem)
{
DetailItem detailedItem = (DetailItem) item;
detailedItem.WhateverDetailedItemCanDo();
}
或者,如果您使用的是C#7:
items.TryDequeue(out Item item);
if (item is DetailItem detailedItem)
{
detailedItem.WhateverDetailedItemCanDo();
}
順便說一句,它與“自定義集合”無關。 如果使用ConcurrentQueue
而不是CQItems
,則結果將相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.