【问题标题】:Force a class to implement a method without restricting the parameters in C#强制类实现方法而不限制C#中的参数
【发布时间】:2011-04-17 20:08:42
【问题描述】:

我有一个包含方法void DoCommand(); 的接口。现在我将强制所有子类继承基类方法DoCommand()。但我需要每个类为此方法定义不同的参数,以便为页面提供正确的参数。

我该怎么做? 有没有可能!

N.B:我正在构建一个 ASP.NET Web 应用程序,并且将实现该方法的页面已经从页面基类继承,所以我认为接口是我唯一的选择。因为类的继承中只允许一个基类。


编辑

我希望说明我需要这个可以帮助我提出更好的设计并坚持 OOP 等丰富的概念。

我有 19 个页面,每个页面都需要一个方法来从这个页面的输入控件中收集数据并将其放入一个对象中(19 个页面.. 19 种对象)

所以我需要 Collect();被强制,那么每个页面都会将正确类型的对象作为参数.. 是否更有意义?

顺便说一句,如果您认为我的设计完全错误,欢迎使用全新的设计模式(Y)

【问题讨论】:

  • 参数不同是什么意思?您可能可以在您的界面中执行类似 void DoCommand(object obj) 的操作,然后将其限制在继承它的类中。我相信只要您的参数类型是一种对象类型,您就可以使用
  • 为什么需要这样做?如果你不知道它有哪些参数,你打算怎么调用它?
  • @Prescott .. 例如,基类中的方法是 DoCommand。但是子类 [1] 将实现它 DoCommand(MyItem item) 并且子类 [2] 将它实现为 DoCommand(Price price) .. 嗯,我会尝试 Object 的事情!
  • @Lasse .. 除非我实现它,否则我无法调用该方法,因此我将在给定的子类中实现它并定义适当的参数。
  • 只要类中的一个函数或者你继承自implents DoCommand()的任何一个类,所有的类都可以继承该接口。

标签: c# asp.net


【解决方案1】:

这是不可能的。最接近的方法是让你的方法是通用的,并采用一个通用参数:

protected abstract void DoCommand<T>(T parameter);

除此之外,您还必须使用某种属性包(例如 NameValueCollection)。

【讨论】:

    【解决方案2】:

    我能想到的最好的是:

    interface IBlaBla
    {
         void DoCommand(params object[] parameters);
    }
    

    然后每个类将参数作为对象序列接收。

    否则,您只需为每个类定义一个全新的方法。

    【讨论】:

      【解决方案3】:

      接口需要具备所有功能(使用不同的参数)。否则没有理由有接口

      编辑:您可能想要这样的东西(使用泛型)

      public interface ICollect<T>
      {
          void Collect(T obj);
      }
      
      public class Car : ICollect<Car>
      {
          public void Collect(Car obj)
          {
          //Do stuff
          }
      }
      

      【讨论】:

      • 。该接口只是我强制子类实现此方法的工具..但是每个类将使用不同的代码(这是正常情况)以及不同的参数来实现它! .. 无论如何都不可能做到这一点并保持良好的设计模式!?
      • 所以你只想关注方法的名称?那是不可能的,我看不出这种实现有什么用处。
      • 所以你认为我应该在每个页面中定义方法并杀死接口的东西?
      【解决方案4】:

      这没有意义。这违反了多态性的整体思想:基类(或接口)有一个方法,而子类提供自己的实现。如果您不是要使用泛型参数,那么您的子类的方法与基类不同,它们只是看起来具有相同的名称。所以你不能强迫你的子类实现“一些具有给定名称但任意参数的例程”。

      【讨论】:

        【解决方案5】:

        不,那是不可能的。不过,你可以试试这个:

        void DoCommand(params object[] args);

        【讨论】:

          猜你喜欢
          • 2019-07-09
          • 1970-01-01
          • 2010-10-27
          • 2010-12-18
          • 2015-10-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-18
          相关资源
          最近更新 更多