2013-05-04 68 views
1

我需要兩個靜態類之間共享一些通用的功能之間共同的功能:分享兩個靜態類

public static class Class 
{ 
    public static void ClassMethod() 
    { 
     SharedMethod<object>(); 
    } 


    //ideally a private method 
    internal static void SharedMethod<T>() 
    { 

    } 
} 

public static class GenericClass<T> 
{ 
    public static void GenericClassMethod() 
    { 
     SharedMethod<T>(); 
    } 
} 

是否有更好的設計嗎? internal是我的最後一個選擇,但真正的方法SharedMethod在這兩個類之外沒有意義。

要求:

  1. 我無法將它們合併到一個單一的類,我需要他們分開,一個通用的,其他沒有。

  2. 這些類不一定是嚴格靜態的,但它們不應該是可實例化的或可繼承的。

  3. SharedMethod可以屬於任何一類,沒關係。

+3

他們不能合併的技術原因是什麼?特別是,我在考慮使用泛型和非泛型方法組合的單個靜態類,例如 – 2013-05-04 14:12:11

+0

@MarcGravell更多的語義原因。 'Class'和'GenericClass <>'是相關的,它們用於類似的目的,但通過將它們分開可以更好地傳達這個想法。它更像「元組」和「元組」等。 – nawfal 2013-05-04 14:15:06

+0

@nawfal通常我喜歡抽象的軟件架構問題,但我認爲沒有人能夠進一步指定你的類代表什麼,它們有什麼操作(以及共享什麼),以及它們應該如何在應用程序中使用。 「Tuple」和「Tuple <>」示例太簡單了,因爲可以簡單地定義'公共類Tuple:Tuple '(因爲它不是靜態的)。 C#沒有'friends',所以'internal'(不管是內部類還是內部方法)可能是你最好的選擇。 – dialer 2013-05-04 14:34:05

回答

1

該解決方法不符合所有3個要求(這是不可能的),但它彌補了我想要的相同功能。

我最終使用了Marc在評論中提到的一個類。但是後來我將嵌套在非泛型類中的泛型類用於泛型功能。

public static class Class 
{ 
    public static void ClassMethod() 
    { 
     SharedMethod<object>(); 
    } 



    static void SharedMethod<T>() 
    { 
     //---- 
    } 



    public static void GenericClassMethod<T>() 
    { 
     return GenericClass<T>.SharedMethod(); 
    } 

    static class GenericClass<T> 
    { 
     static void SharedMethod() 
     { 
      //available here since private members of outer class is visible to nested class 
      SharedMethod<T>(); 
     } 
    } 
} 

所以,現在,即使調用必須從我如何在這個問題本來想把它做有點不同,功能上都是平等的。

-1

聲明這些類是封閉的 - 這樣它們將不會被繼承。

如果您將權限從私有更改爲受保護的方式,則應用程序中的任何內容都可以看到該方法,但對於嘗試使用您的方法的其他應用程序將不可見。

希望這會有所幫助!

+0

沒有幫助,因爲共享功能仍然是'public/internal' – nawfal 2013-05-04 14:16:05

+2

這只是錯誤。你的編譯器可能會因爲在密封類中保護成員而尖叫你。這沒有意義。也許你混淆了詞彙,並且想說點別的? – nvoigt 2013-05-04 14:17:25

-1

如果你可以使用單例模式,你可以有2個類,通用類繼承自標準類。您也可以將您的靜態方法,這裏是它可以是什麼樣子:

internal class ClassA 
{ 
    private static ClassA _instance; 
    private static ClassA Instance 
    { 
     get 
     { 
      if (_instance == null) _instance = new ClassA(); 
      return _instance; 
     } 
    } 

    protected void sharedMethod<T>() { } 

    public static void ClassMethod() 
    { 
     Instance.sharedMethod<object>(); 
    } 
} 

public sealed class GenericClass<T> : ClassA 
{ 
    private static GenericClass<T> _instance; 
    private static GenericClass<T> Instance 
    { 
     get 
     { 
      if (_instance == null) _instance = new GenericClass<T>(); 
      return _instance; 
     } 
    } 

    public static void GenericClassMethod() 
    { 
     Instance.sharedMethod<T>(); 
    } 
} 
+0

這是什麼意思是'ClassA'是可繼承的,違反了規則2 – nawfal 2013-05-06 02:56:59

+0

yep忘了那個......但是如果你只想要2個類共享一個方法,那麼只有兩種方法可以做到這一點:第三個方法包含方法,但然後該方法將被暴露,或從一個類繼承...順便說一句,你可以使ClassA內部,它會更不容易訪問,我發現它比內部方法選項更安全 – ppetrov 2013-05-06 03:03:38

+0

在這種情況下,我的第一個方法在問題中比較簡單。順便說一句,你可以讓你的泛型類密封 – nawfal 2013-05-06 03:05:55

1

首先我想你不能滿足3條規則,但後來我想到了反思,我想出了一些作品但不應該,除非你使用真的沒有完成你所需要的

我不建議使用它但只是爲了好玩,我會張貼代碼的任何其他方式:

public static class ClassA 
{ 
    private static void sharedMethod<T>() { } 

    public static void ClassMethod() 
    { 
     sharedMethod<object>(); 
    } 
} 

public static class GenericClass<T> 
{ 
    static MethodInfo sharedMethodInfo; 

    static GenericClass() 
    { 
     MethodInfo mi = typeof(ClassA).GetMethod("sharedMethod", BindingFlags.NonPublic | BindingFlags.Static); 
     sharedMethodInfo = mi.MakeGenericMethod(new Type[] { typeof(T) }); 
    } 

    public static void GenericClassMethod() 
    { 
     sharedMethodInfo.Invoke(null, null); 
    } 
}