【问题标题】:Issue understanding the distinction between Methods, Generic Types etc问题理解方法、通用类型等之间的区别
【发布时间】:2010-09-02 14:22:08
【问题描述】:

在下面的代码中,“Move”公共类派生自泛型“Submit”。 “提交”是一个方法,是DSS模型的一部分,它处理消息,接受两个参数,一个是消息体,一个是消息响应。

我的问题是:类如何或为什么从方法派生?!

在我看来(因为我只是一个初学者)“泛型类型”就是这个意思……任何方法或类(以及任何“代码块”)都可以成为一种类型。此外,没有类型......一切都只是一个你可以从中派生的“类”(但你可能不能重载字符串)

这基本上意味着实际上没有方法或类型,而只是类(和一些“子”类(前方法)),您可以从所有东西中派生?!

谢谢。 我不是在寻找“除此之外”的专家,因为有些小事情是不可能的。我想确认一下,这实际上是 90% 的程序员在做的事情。

  public class Move : Submit<MoveRequest, PortSet<DefaultSubmitResponseType, Fault>>
  {
    public Move()
    {
    }

    public Move(MoveRequest body) : base(body)
    {
    }

  }

【问题讨论】:

    标签: c# generics types


    【解决方案1】:

    您不能从方法派生。 Submit&lt;T, V, E&gt; 必须是一个类。

    【讨论】:

      【解决方案2】:

      更详细一点,Submit 可能是一个“动作”,因此通常被认为是一种方法,但在您的上下文中,Submit 确实是一个类。这可能是“命令”设计模式的一个示例,其中对操作的请求被封装在一个对象中,因此可以被处理该命令的类传递和执行。

      从概念上讲,泛型是能够在一组“内部”类型中提供类似功能的类。基本示例是一个 Math 类,可以对两个数值类型的变量进行加减乘除;你知道,非常高级的数学是你无法做到的。大多数类型系统中有很多数字类型(在 C# 中,您有 byte、short、int、long、float、double 和 decimal,以及无符号变体)。而不是使用强烈定义它们所处理类型的方法来实现 MathByte、MathInt、MathLong 等,或者实现与任何对象一起使用的 Math 类(因此需要您检查传入的所有内容的类型以确定您可以工作使用类型),您可以简单地创建一个Math&lt;T&gt; 类,其中 T 可以是任何数字类型。

      类型参数T与方法参数不同;当你声明一个类的实例时,你指定了一个实例将被设置为处理的类型。然后,该实例只能使用指定类型的对象,但您可以实例化 Math&lt;byte&gt;Math&lt;decimal&gt; 以使用不同的类型。 Math 中定义的方法指定类型为 T 的输入参数,并且 T 在实例化时被“替换”为实例化类时声明的类型。

      泛型有助于支持良好编码实践的 DRY(“不要重复自己”)原则,同时保持类型完整性。 MathLong、MathInt、MathByte 等的内部代码都相似或相同;主要区别在于他们处理的对象的类型。您无需将同一个类重写 10 次,而是编写一个可以由您的类的使用者更具体地定义其工作类型的类。

      希望这更具教育意义。

      【讨论】:

        【解决方案3】:

        不,Submit 绝对不是一种方法。一个类只能从另一个类派生,或实现一个接口。因此,Submit 必须是类或接口。

        【讨论】:

          猜你喜欢
          • 2015-12-11
          • 1970-01-01
          • 2012-07-28
          • 2021-07-15
          • 2014-11-26
          • 2021-09-13
          • 2013-11-04
          • 2012-12-09
          • 1970-01-01
          相关资源
          最近更新 更多