如何在其实例中的类中定义方法?

时间:2009-03-17 07:57:03

标签: c# .net oop

这可能很容易,但我很难过。我想创建一个通用类,它将在我的程序中多次使用。我希望它非常轻巧,超级快。

对于C#中的一个非常简单的例子:

public class SystemTest
{ 
   public TestMethod(string testString)
   {
      if(testString == "blue")
      {
         RunA();
      }
      else if(testString == "red")
      {
         RunB();
      }
      else if(testString == "orange")
      {
         RunA();
      }
      else if(testString == "pink")
      {
         RunB();
      }
   }

   protected void RunA() {}
   protected void RunB() {}       
}

我希望RunA()和RunB()由实例化此类的对象定义和控制。完全由对象实例化SystemTest类来决定RunA()和RunB()将要做什么。你怎么做到这一点?

我不希望实例对象总是继承这个SystemTest类,我希望它能够快速运行。我唯一想到的是复杂的,处理器密集型的东西。我知道有一种更简单的方法可以做到这一点。


编辑:通常,哪个运行得更快,代理或接口方法在下面的答案?

6 个答案:

答案 0 :(得分:8)

你可以:

public class SystemTest
{ 
   Action RunA;
   Action RunB;
   public SystemTest(Action a, Action b)
   {
      RunA = a;
      RunB = b;
   }
   //rest of the class
}

答案 1 :(得分:6)

听起来你想要一个界面,比如:

interface ITestable {
    void RunA();
    void RunB();
}

然后将其传递给(SystemTest ctor或TestMethod)。调用类可以(例如)实现ITestable并调用TestMethod(this,someString)。

或者,也许是一种扩展方法?顺便说一下,string arg可能是一个枚举?

public interface ITestable {
    void RunA();
    void RunB();
}
public static class SystemTest
{ 
   public static void TestMethod(this ITestable item, string testString)
   {
      if(testString == "blue")
      {
         item.RunA();
      }
      else if(testString == "red")
      {
          item.RunB();
      }
      else if(testString == "orange")
      {
          item.RunA();
      }
      else if(testString == "pink")
      {
          item.RunB();
      }
   }
}

然后调用者只需实现ITestable,任何人都可以为实例foo.SomeMethod(color);调用foo

答案 2 :(得分:0)

如果只有有限的颜色选项,如蓝色,红色,橙色和粉红色。您可以创建一个类似

的枚举
public enum Color 
{
   Blue,
   Red,
   Orange,
   Pink
}

并将此枚举与switch语句一起使用,并提及此处提及的任何解决方案。编译器将枚举视为整数&因为你想要表现。整数比较比字符串比较更有效。

switch (color)
{
case Color.Blue:
case Color.Orange: 
                   RunA();
                   break;
case Color.Red:
case Color.Pink:   RunB();
                   break;
}

答案 3 :(得分:0)

未提及的另一个选项是将RunA和RunB更改为事件而不是方法。 .net中的事件相当轻量且快速,并且可能与您的使用模型匹配,而无需构建新类来定义每个实例/用法的行为。

鉴于您需要基于实例的行为,您需要重新设计它以使用委托或事件,或者传入单个基类或接口并直接调用方法。

答案 4 :(得分:0)

将RunA,RunB方法公开为事件,以便任何调用者都可以附加到它们。例:

public class SystemTest
{ 
   public TestMethod(string testString)
   {
      if(testString == "blue")
      {
         RunA();
      }
      else if(testString == "red")
      {
         RunB();
      }
      else if(testString == "orange")
      {
         RunA();
      }
      else if(testString == "pink")
      {
         RunB();
      }
   }

   protected event Action RunA;
   protected event Action RunB;       
}

答案 5 :(得分:0)

为什么在所有需要的时候使用一个类是数据结构?

Dictionary<string, Action> MethodMap = new Dictionary<string, Action>
{
   { "red", RedMethod },
   { "blue", BlueMethod },
   { "green", GreenMethod },
   { "yellow", YellowMethod }
};

然后你不需要一个类来运行该方法;简单地

Method[key];

会做的。