【问题标题】:Generic Class:: Type Parameter <T> Property Inheritance泛型类:: 类型参数 <T> 属性继承
【发布时间】:2015-11-18 22:11:39
【问题描述】:

我的代码:

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:我已经提出了一个关于这个right here 的问题,但我不确定如何提出我的问题,但我现在知道了。我将其保持打开状态,以防有人通过我得到的答案找到他们问题的答案。

编辑#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

这就是我的意思,每个类都有它自己的属性。我希望这能让您对我正在尝试做的事情有所了解。

【问题讨论】:

  • 你想达到什么目的?
  • 这似乎是XY problem
  • 您不能在 C# 中以这种方式包装 T,因为 C++ 模板和 C# 泛型之间的性质不同。所以,最好解释一下,你打算如何/何时/在哪里使用它。
  • 恐怕你的建议无济于事,Sayse。我建议我的想法,你可以在其中发展。我不知道,我不认为这是一个 XY 问题。我在主要帖子 dcastro 中要求解决方法。 @haim770,丹尼斯:我更新了主帖,用一个更清晰的例子来说明我想要做什么。

标签: c# inheritance types properties parameters


【解决方案1】:

您可能想要彻底重新考虑您的实现,因为这不是 C# 的设计初衷。你可以做一些 hacky 的事情来完成这项工作,但它不是很漂亮:

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 上公开您感兴趣的任何字段才能使其正常工作。

【讨论】:

  • 这不是我想要的解决方法,但似乎没有其他办法,所以我就用这个“解决方法”来满足自己。
  • 很高兴为您提供帮助!这是一个无耻的 hack,但它确实近似于你至少想要的行为......
【解决方案2】:

您无法使用 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";

【讨论】:

  • 我将 Baldricks 响应选为答案,因为它是与我尝试做的最接近的实现。虽然,您的实现是一个有趣的观点,也是一个很好的观点,因此我对它投了赞成票。谢谢你的帮助,丹尼斯。我希望这能回答另一个问题。
猜你喜欢
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
  • 2018-09-27
  • 2015-09-15
  • 2019-03-08
  • 1970-01-01
  • 2022-01-09
相关资源
最近更新 更多