我有多个类ClassA,ClassB,ClassC.....在这些类里面都有个名为Out...(比如说OutVoyage)函数,且结构相似,现在我想在这里类传递一个参数到主类里(且认为是MainClass吧),这样主类就知道将要调动哪个类里的Out...方法,如何做呢?不能用枚举!

解决方案 »

  1.   

    声明接口里含有方法OutVoyage,让ClassA,ClassB,ClassC三个类去实现这个接口..
      

  2.   

    Class A
    {
      private void OutputA()
     {.... }
     ....//调动 MainClass中的方法do()的函数。
    }
    ClassB
    {
     private Void OutputB()
     {....}
      ...//调动 MainClass中的方法do()的函数。
    }
    ClassMain
    {
     private void do()
      {
      if ClassA中的某个方法方法调动我,我去处理ClassA中的方法OutputA()。
      如果ClassB中的某个方法调用了我,则处理ClassB中的方法OutputB()。
      }}
      

  3.   

    很明显的简单问题复杂化...既然3个类的Output()方法实现3个不同的功能,你直接在方法里面调用不就行了吗?
    假如你的Output()里面可能需要调用到相同的方法,你应该让3个类继承同个父类,然后重载父类的方法.再实现各自需要的其余功能.
    即使用你的方法去实现,也必须要有参数来让被调用的类知道.
      

  4.   

    interface iclass
    {
    void Output();}
    Class A
    {
      private void Output()
     {.... }
    void s()
    {
    ClassMain m=new ClassMain()
    m.do(this);
    }}
    ClassB
    {
     private Void Output()
     {....}
    void s()
    {
    ClassMain m=new ClassMain()
    m.do(this);
    }}
    ClassMain
    {
     private void do( iclass cla)
      {
        cla.Output();
      }}你看是这个意思吗?
      

  5.   

    Sorry,刚才没有继承接口,应该这样
    interface iclass
    {
    void Output();}
    Class A:iclass
    {
      private void Output()
     {.... }
    void s()
    {
    ClassMain m=new ClassMain()
    m.do(this);
    }}
    ClassB:iclass
    {
     private Void Output()
     {....}
    void s()
    {
    ClassMain m=new ClassMain()
    m.do(this);
    }}
    ClassMain
    {
     private void do( iclass cla)
      {
        cla.Output();
      }}
      

  6.   

    呵呵,楼上的误解啦,我的OutputA,OutputB它们是不相同的,没有任何的关系的,且还有很多类比如说ClassC,ClassD,ClassE.......中有OutputC(),OutputD(),OutoutE().....我是想如果是ClassA调用了ClassMain中的方法,我就去处理ClassA中的OutputA方法,如果是ClassB调用了ClassMain中的方法,我就去处理ClassB中的OutputB方法。。
         我想在ClassA,ClassB等等类在调用ClassMain的do()方法时,将ClassA,ClassB等等类中的OutputA,OutputB等方法传过去ClassMain中去,我知道在C++里可以通过调用相一个函数指针去实现,C#中不知如何实现。
      

  7.   

    public delegate 函数返回类型 OutVoyageDelegate(.....参数定义....);class MainClass{
      ...
      private void do(OutVoyageDelegate method)
      {
         ...
         method(...参数....);
         ...
      }
      ...
      ...
      主程序中,使用任意对象的方法作为参数去调用do,编译器会检查方法ClassA、ClassB、ClassC中OutVoyage方法签名与 OutVoyageDelegate 的签名是否一致。例如:
      ClassA a=new ClassA();
      do(a.OutVoyage);
      ClassB b=new ClassB();
      do(b.OutVoyage);
      ...
    }
    不过,如果可能,让他们具有相同的父类或者接口,找出多态的逻辑含义,则有更好的设计优势。
      

  8.   

    与指针类似,Delegate是“只问方法签名”不问“设计合同”的。有人认为这才叫做“技术”,有人则认为恰恰应该避免“过分技术”。看你的编程思想方向如何。我是认为应该尽量让程序遵循合同、约定,也就是清晰地遵循和继承接口的逻辑含义。因为我通常是设计架构和断言,然后让程序员去实现细节的,所以我优先注重面向领域应用的逻辑一致性。
      

  9.   

    呵呵,给你个再开阔一点的思路,你可以写:  ClassA a=new ClassA();
      OutVoyageDelegate call=a.OutVoyage;
      ClassB b=new ClassB();
      call+=b.OutVoyage;
      do(call);