2013-05-04 39 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); 
    } 
}