2014-03-31 98 views
2

我有一個抽象BaseClass,從中繼承了多個派生類。 我想寫一個通用的方法,做一個共同的工作,所以我不需要爲每個派生類編寫該方法。編寫派生類的通用方法

目前代碼 -

public abstract class BaseClass{} 


    public class Derived1 : BaseClass{ 
     public Derived1 CommonWork(){ 

     /* Common work */ 
     return objDerived1; 
     } 

} 

public class Derived2 : BaseClass{ 
     public Derived2 CommonWork(){ 

     /* Common work */ 
     return objDerived2; 
     } 

} 

我想要的方式 -

public T CommonWork where T : BaseClass 

{ 
/* Common work */ 
return T; 

} 

現在我不知道如何以及在何處寫這個方法。 Coudnt在其他地方找到它。 請建議。由於

回答

3

難道你的意思是這樣的:

public class CommonWork<T> 
    where T: BaseClass, 
      new T()// <- probably you'll need it to create instances of T 

    public T CommonWork(){ 
    T result = new T(); 
    ... 

    return T; 
    } 
} 

... 

Commonwork<Derived2> common = new Commonwork<Derived2>(); 

BaseClass result = common.CommonWork(); 
0

你會在BaseClass定義它,包括在方法聲明中的通用說法:

public T CommonWork<T>() where T : BaseClass { 
    T returnObj; 
    returnObj = default(T); // To initialize a new instance 
    returnObj = this as T; // To operate on the current object 

    /* Common work */ 

    return returnObj; 
} 
0

入住這

class Program 
    { 
     static void Main(string[] args) 
     { 
      var derived1=new Derived1(); 
      derived1.CommonWork(); 

      var derived2 = new Derived2(); 
      derived2.CommonWork(); 

      Console.Read(); 
     } 
    } 

    public abstract class BaseClass 
    { 
     public string ClassName; 

     public T CommonWork<T>(T obj) 
     { 
      var baseClass = obj as BaseClass; 
      Console.WriteLine(baseClass.ClassName); 
      return obj; 
     } 


    } 

    public class Derived1 : BaseClass 
    { 
     public Derived1 CommonWork() 
     { 
      this.ClassName = "Derived1"; 
      return this.CommonWork(this);    
     } 

    } 

    public class Derived2 : BaseClass 
    { 
     public Derived2 CommonWork() 
     { 
      this.ClassName = "Derived2"; 
      return this.CommonWork(this); 

     } 

    } 
0

這是普通工作如何在基類中完成的,但該方法返回派生的cl屁股對象:

public abstract class BaseClass<T> where T: BaseClass<T>, new() 
{ 
    public int Value { get; private set; } 
    public T CommonWork() 
    { 
     var result = new T {Value = 1}; 
     return result; 
    } 
} 

public class Derived1 : BaseClass<Derived1> 
{ 
} 

public class Derived2 : BaseClass<Derived2> 
{ 
} 

你這樣調用它:

Derived2 derived2 = new Derived2(); 
Derived2 anOtherderived2 = derived2.CommonWork(); 
int value = anOtherderived2.Value; // 2 
+0

不幸的是,這僅適用於繼承的一個水平,因爲沒有辦法一類'SubDerived1'可以從兩個'Derived1'繼承和'BaseClass '。但是,人們可以定義一個協變接口,並且每種類型都可以自行實現。如果一個顯式實現但包含一個在接口上運行的擴展方法,可能會實現正確的語義(讓每個事物的'CommonWork'返回一個適當類型的對象)。 – supercat

+0

@supercat你是對的。但是OP在他的例子中並沒有要求更高一級的水平。如果他需要更多層次,那麼你的選擇可能是一個解決方案。 –

相關問題