簡體   English   中英

通用類::類型參數 <T> 財產繼承

[英]Generic Class:: Type Parameter <T> Property Inheritance

我的代碼:

class ClassX;
class Class2 : ClassX;
class Class3 : ClassX;

Class2和Class3彼此之間沒有任何關聯,除了它們共享相同的基類。 Class2和Class3不共享相同的屬性,數據類型或數量的屬性。

現在,我想做的是:

class Class<T> : T;

static void Main()
{
    Class<Class2> foo = new Class<Class2>();
    foo.Class2_Property = value;

    Console.Read();
}

我知道此代碼是不可能的,但是有什么解決方法嗎?

在C ++中,您可以使用運算符重載來做到這一點,如下所示:

public : operator return_data_type const;    

提前致謝。

PS:我已經在這里打開了一個有關此問題的問題,但是我不確定如何問我的問題,但是現在是我了。 如果有人通過我得到的答案找到他們問題的答案,我將其保留為開放狀態。

編輯#1:

我有一個Packet類,它具有共享的Packet屬性和方法,並且不同的數據包具有自己的標頭和不同的內容。 我正在更改數據包系統。 基本上我想做Packet,其中PacketClass是特定Packet的名稱,例如LoginInfo。 LoginInfo類將包含屬性:

public PacketHeader Header;
public string Username;
public string Password;

因此:

    Packet<LoginInfo> foo = new Packet<LoginInfo>();
    foo.Username = "user";
    byte[] buf = foo.ToArray(); // Part of the Packet<T> class

這就是我的意思,每個類都有其自己的屬性。 我希望這能使您對我正在嘗試做的事情有個好主意。

您可能想完全重新考慮您的實現,因為這不是C#設計的目的。 您可以做一些棘手的事情來完成這項工作,但這不是很漂亮:

class Class<T> where T : new()
{
    public T Value = new T();
}

這將根據類型T必須具有無參數構造函數的約束為您的“基本”類型創建一個“容器”。

然后,您可以執行以下操作:

class ClassX {}

class Class2 : ClassX 
{ 
    public int test = 10;
}

然后,您可以像這樣消耗假的“派生”類:

Class<Class2> foo = new Class<Class2>();
var test = foo.Value.test;

您還必須公開您對Class2感興趣的任何字段,此功能才能起作用。

您不能完全使用C#來完成您想做的事情,但是您不應該這樣做。
這是設計問題。 不是包內容。 包含一些標題和一些內容:

interface IPacketItem
{
    byte[] ToArray();
}

class Packet<THeader, TContent>
    where THeader : IPacketItem
    where TContent : IPacketItem
{
    // header and content must be initialized somehow;
    // maybe, using existing instances, maybe using new() constraint
    public THeader Header { get; private set; }
    public TContent Content { get; private set; }

    public byte[] ToArray()
    {
        // builds an array using IPacketItem.ToArray
    }
}

var loginPacket = new Packet<PacketHeader, LoginInfo>();
loginPacket.Content.UserName = "user";

暫無
暫無

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

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