2011-01-06 135 views
0

我有一个抽象类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)必须被使用。 我认为有关传递B的一个实例,或使用X.

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

在头行 “以与一般辛格尔顿的解决方案作为一个抽象类”

+0

你会从中得到什么错误?编译错误?对我来说似乎很好... – Marnix 2011-01-06 22:52:22

+0

您需要更具体地说明您的“不工作”是什么意思。 – 2011-01-06 22:52:53

回答

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"); 
    } 
} 
3

你必须在测试中犯了一个错误,代码工作正常:

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"); 
    } 
} 

输出:
Ç

+0

编辑我的问题。忘了说A是一个通用的抽象单例类。查看使用链接的示例。 – Ferhat 2011-01-06 23:11:02

1

为我工作。我得到预期的

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 ; 
     } 
    } 
} 

干杯!

1

我不知道我理解的问题,这是我的实现,它的工作原理:

命名空间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(); 
    } 
} 

}

相关问题