簡體   English   中英

自定義集合和繼承的類類型

[英]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”。

我不想為每個繼承的類型做一個特定的集合。 我想念哪一塊? 謝謝!

編輯:更新以獲取其他信息。 ItemInterface並對其進行修復,以便在該接口的第一IItem中定義通用方法並不能解決問題,甚至不能使該集合成為IItem類型的IItem

我在這里添加一些細節,以防萬一我完全以錯誤的方式來處理這個問題。 該軟件是用於處理銀行業務的其他軟件的質量檢查工具。 項目可以是Cash : Item (或IItem ), Check: BaseReturnCheck : 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.

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