2016-12-29 27 views
0

我是一個較新的編程和我有一個關於通用的問題。這是我的小程序的結構:C#通用:如何正確包裝方法

public enum FieldsA 
{ 
    A, 
    B, 
    C 
} 

public enum FieldsB 
{ 
    A, 
    B, 
    C 
} 

public abstract class Page 
{ 

} 

public abstract class BasePage<T> : Page where T : struct, IComparable 
{ 
    public void Update() 
    { 
     // code 
    } 
} 

public class ClassA : BasePage<FieldsA> 
{ 

} 

public class ClassB : BasePage<FieldsB> 
{ 

} 

public class MainClassA 
{ 
    private ClassA _classA; 

    public MainClassA(ClassA classA) 
    { 
     _classA = classA; 
    } 


    public void Method() 
    { 
     _classA.Update();    
    } 
} 

public class MainClassB 
{ 
    private ClassB _classB; 

    public MainClassB(ClassB classB) 
    { 
     _classB = classB; 
    } 

    public void Method() 
    { 
     _classB.Update();   
    } 
} 

我想問如何正確地創建一些靜態的方法,在這裏我換Update()方法。我想是這樣的:

public static class Helper 
{   
    public static void Update<T>(BasePage<T> page) 
    { 
     page.Update(); 
    } 
} 

Method()替換內容:

public class MainClassB 
{ 
    private ClassB _classB; 

    public MainClassB(ClassB classB) 
    { 
     _classB = classB; 
    } 

    public void Method() 
    { 
     Helper.Update(_classB);   
    } 
} 

(同爲MainClassA),但它不工作 - >編譯錯誤:類型T必須是一個非可以爲null的值類型,以便將其用作泛型類型或方法BasePage中的參數T. 感謝您的提示和幫助。

+0

請更具體的比「它不工作」。你有沒有編譯錯誤?運行時異常?還有別的嗎? – JamesQMurphy

+0

我更新了它。公共靜態無效更新(BasePage 頁面)中存在編譯錯誤 – Deyeth

回答

1

你的問題出在哪裏聲明:

public abstract class BasePage<T> : Page where T : struct, IComparable 

你需要有同樣的事情在你的靜態類

public static class Helper 
{   
    public static void Update<T>(BasePage<T> page) where T : struct, IComparable 
    { 
     page.Update(); 
    } 
} 

因爲BasePage<T>需要它。

可能足以將where T: class爲好,至少直到T不是在方式使用,它需要是struct或執行,如果IComparable接口。

請同時參閱該頁面:https://msdn.microsoft.com/en-us/library/bb384067.aspx其中約where條款更多的信息

0

你正在嘗試做的,看起來很像一個訪問者模式對我說:

當您查看模式時,可能會發現與您的示例代碼有一些相似之處: BasePage<T>將是具有兩個具體實現ClassAClassB的抽象元素。 BasePage<T>.Update()的公共接口很可能是Visit()方法。

使用OO中的設計模式可以讓您專注於編寫您的功能,而不用擔心良好的課程設計。它也可以爲您解決一些麻煩,例如單元測試靜態函數。 但是,在正確的情況下使用正確的模式。

當您向下滾動dofacotry鏈接時,可以找到幾個C#示例實現。