2011-01-06 63 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(); 
    } 
} 

}

相關問題