【问题标题】:Method having an abstract class as a parameter具有抽象类作为参数的方法
【发布时间】:2011-06-04 23:37:36
【问题描述】:

我有一个抽象类 A,我在其中派生了类 B 和 C。 A类提供了一个抽象方法DoJOB(),由两个派生类实现。

有一个类X,里面有方法,需要调用DoJOB()。 X 类不能包含任何代码,如 B.DoJOB() 或 C.DoJOB()。

例子:

public class X
{
private A foo;

public X(A concrete)
{
foo = concrete;
}

public FunnyMethod()
{
foo.DoJOB();
}

}

在实例化类 X 时,我想决定必须使用哪个派生类(B 或 C)。 我考虑过使用 X 的构造函数传递 B 或 C 的实例。

X kewl = new X(new C());
kewl.FunnyMethod(); //calls C.DoJOB()

kewl = new X(new B());
kewl.FunnyMethod(); // calls B.DoJOB()

我的测试表明,使用参数 A 声明方法不起作用。我错过了什么吗? 我怎样才能正确地实现它?

(A是抽象的,不能实例化)

编辑: 对不起,我忘了……

A 类是一个通用的抽象单例:

abstract public class A<T> where T : A<T>
{
    ....
}

public sealed class B : A<B>
{
    .....
}

public sealed class C : A<C>
{
    .....
}

参见示例: http://www.c-sharpcorner.com/UploadFile/snorrebaard/GenericSingleton11172008110419AM/GenericSingleton.aspx

在标题“将通用单例作为抽象类的解决方案”下

【问题讨论】:

  • 你从中得到了什么错误?编译错误?对我来说似乎很好......
  • 您需要更具体地了解“不工作”的含义。

标签: c# singleton abstract-class derived-class


【解决方案1】:

供您编辑:

void Main()
{
var kewl = new X<C>(new C());
kewl.FunnyMethod(); //calls C.DoJOB()

var kewl2 = new X<B>(new B());
kewl2.FunnyMethod(); // calls B.DoJOB()

}

public class X <T> where T : A<T>
{
    private A<T> foo;

    public X(A<T> concrete)
    {
        foo = concrete;
    }

    public void FunnyMethod()
    {
        foo.DoJOB();
    }
}

public abstract class A<T> where T : A<T>
{
    public abstract void DoJOB();
}

public class B : A<B>
{
    public override void DoJOB()
    {
        Console.WriteLine("B");
    }
}

public class C : A<C>
{
    public override void DoJOB()
    {
        Console.WriteLine("C");
    }
}

【讨论】:

  • 感谢您的回答。对我帮助很大。
【解决方案2】:

我不确定我是否理解这个问题,这是我的实现,它有效:

命名空间 CSharpConsole {

public abstract class A {
    public abstract void Test();
}
public class B : A {
    public override void Test() {
        System.Console.WriteLine("B:Test called!");
    }
}
public class C : A {
    public override void Test() {
        System.Console.WriteLine("C:Test called!");
    }
}    
class Program {
    private A _concrete;
    public Program(A concrete) {
        _concrete = concrete;
    }
    public void DoTest() {
        _concrete.Test();
    }
    static void Main(string[] args) {
        Program pb = new Program(new B());
        pb.DoTest();
        Program pc = new Program(new C());
        pc.DoTest();
    }
}

}

【讨论】:

    【解决方案3】:

    为我工作。我得到了预期

    I did something interesting!
    So Did I!
    

    当我运行它时。

    将其粘贴到您的 Visual Studio 中并熏制它

    using System;
    
    namespace TestDrive
    {
        class Program
        {
            static void Main( string[] args )
            {
                ServiceConsumer x = new ServiceConsumer( new ConcreteService2() ) ;
    
                x.FunnyMethod() ;
    
                return ;
            }
    
        }
    
        abstract class AbstractService
        {
            public abstract void DoSomethingInteresting() ;
        }
    
        class ConcreteService1 : AbstractService
        {
            public override void DoSomethingInteresting()
            {
                Console.WriteLine("I did something interesting!");
                return ;
            }
        }
    
        class ConcreteService2 : ConcreteService1
        {
            public override void DoSomethingInteresting()
            {
                base.DoSomethingInteresting() ;
                Console.WriteLine("So Did I!");
                return ;
            }
        }
    
        class ConcreteService : AbstractService
        {
            public override void DoSomethingInteresting()
            {
                Console.WriteLine("Not It's my turn to do something interesting!") ;
                return ;
            }
        }
    
        class ServiceConsumer
        {
            private AbstractService Service ;
            public ServiceConsumer( AbstractService serviceInstance )
            {
                this.Service = serviceInstance ;
                return ;
            }
            public void FunnyMethod()
            {
                Service.DoSomethingInteresting() ;
                return ;
            }
        }
    }
    

    干杯!

    【讨论】:

      【解决方案4】:

      你一定是测试出错了,代码运行正常:

      void Main()
      {
      X kewl = new X(new C());
      kewl.FunnyMethod(); //calls C.DoJOB()
      
      kewl = new X(new B());
      kewl.FunnyMethod(); // calls B.DoJOB()
      
      }
      
      public class X
      {
          private A foo;
      
          public X(A concrete)
          {
              foo = concrete;
          }
      
          public void FunnyMethod()
          {
              foo.DoJOB();
          }
      }
      
      public abstract class A
      {
          public abstract void DoJOB();
      }
      
      public class B : A
      {
          public override void DoJOB()
          {
              Console.WriteLine("B");
          }
      }
      
      public class C : A
      {
          public override void DoJOB()
          {
              Console.WriteLine("C");
          }
      }
      

      输出:
      C

      【讨论】:

      • 编辑了我的问题。忘了说 A 是一个通用的抽象单例类。使用链接查看示例。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-30
      相关资源
      最近更新 更多