繁体   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