2017-08-13 31 views
2

我看了一些在.NET流量实现的,并认为this approach是相当膨胀:极品虚拟,抽象的静态成员的限制,解决方法为Facebook流量的.NET实现

  • 它使用静态成员,而不是枚举,使XAML更好
  • 无需转换为/从枚举类型(更简洁的代码)
  • 易于集成几乎所有的pub/sub机制。

话虽这么说,我想保持静态属性到字符串编码技术,但我不能做了以下工作:

public class BitnameTypesBase 
{ 
    // I want to override this in base classes.. but can't 
    public static string ChainName; 

    public static string GET_BITNAME = "get_bitname_" + ChainName; 
    public static string SEND_BITNAME = "send_bitname_" + ChainName; 
    public static string QUERY_BITNAME = "query_bitname_" + ChainName; 
} 

public class BitcoinBitName : BitnameTypesBase 
{ 
    // Ouch, can't override field or properties 
    override public static string ChainName = "Bitcoin"; 

    public static string MySpecialAction = "special_bitname_" + ChainName; 
} 

public class OthercoinBitName : BitnameTypesBase 
{ 
    // Ouch, can't override field or properties 
    override public static string ChainName = "something new"; 

    public static string MySpecialAction = "special_bitname_" + ChainName; 
} 

问题

  • 语言中是否有这样的内容?
  • 有没有我可以做的任何预编译脚本,这将允许这?
  • 是否有任何Fody插件,我可以使用,可以帮助(我没看到一个)
+0

'public static new string ChainName {get;组; }'会编译,但我不确定你想要实现什么。 – DavidG

+0

@DavidG我希望'BitcoinBitName.STATIC_STRING_IN_CAPS'能够根据字符串的不同从一个继承类到另一个类.join() – LamonteCristo

+0

@DavidG通过添加第二个硬币使我的用例更加清晰,并实际分配一个覆盖属性/字段的值。 (以工作为准) – LamonteCristo

回答

2

不能覆盖一个static成员,但你可以通过使用new修改隐藏它们。对于的exaple:

public class BitnameTypesBase 
{ 
    public static string ChainName; 

    public static string GET_BITNAME = "get_bitname_" + ChainName; 
    public static string SEND_BITNAME = "send_bitname_" + ChainName; 
    public static string QUERY_BITNAME = "query_bitname_" + ChainName; 
} 

public class BitcoinBitName : BitnameTypesBase 
{ 
    public static new string ChainName = "Bitcoin"; 
    public static string MySpecialAction = "special_bitname_" + ChainName; 
} 

public class OthercoinBitName : BitnameTypesBase 
{ 
    public static new string ChainName = "something new"; 
    public static string MySpecialAction = "special_bitname_" + ChainName; 
} 

现在:

Console.WriteLine(BitcoinBitName.MySpecialAction); 
Console.WriteLine(OthercoinBitName.MySpecialAction); 

将输出:

special_bitname_Bitcoin 
special_bitname_something new 
2

这里有一个经典的面向对象的选择(我使用这个模式很多):

然后,你就这样使用:

Console.WriteLine(BitnameTypesBase.Of<BitcoinBitName>.Instance.MySpecialAction); 
Console.WriteLine(BitnameTypesBase.Of<OthercoinName>.Instance.MySpecialAction); 

如果冗长有点多,你总是可以宣布在基类的静态成员引用的例子:

public abstract class BitnameTypesBase 
{ 
    BitnameTypeBase Bitcoin = Of<BitcoinBitName>.Instance; 
    BitnameTypeBase Othercoin = Of<OthercoinName>.Instance; 

    //the rest of the class as defined before 

} 

然后使用网站成为:

Console.WriteLine(BitnameTypesBase.Bitcoin.MySpecialAction); 
Console.WriteLine(BitnameTypesBase.Othercoin.MySpecialAction); 

甚至更好:如果您使用C#6或更高版本,则可以将using static BitnameTypesBase;添加到文件顶部(其他using namespace ...声明中),因此使用站点变为:

Console.WriteLine(Bitcoin.MySpecialAction); 
Console.WriteLine(Othercoin.MySpecialAction);