常量值 - 用类初始化

时间:2014-05-09 07:54:49

标签: c#

我有一个名为ConsoleTheme的抽象类,它是控制台主题(如Dark和Light主题)的基类。

public abstract class ConsoleTheme
{
    public abstract ConsoleColor BackgroundColor { get; }
}

我希望在常量类中有一个常量值,因此可以选择任何可以从类ConsoleTheme继承的类。

public class LightTheme : ConsoleTheme
{
    public override ConsoleColor BackgroundColor
    {
        get
        {
            return ConsoleColor.Black;
        }
    }
}

然而,它说这些类像变量一样使用,但它们是一种类型。我怎样才能做到这一点?

例如:

public const ConsoleTheme = LightTheme;

5 个答案:

答案 0 :(得分:2)

public abstract class ConsoleTheme
{
    public abstract ConsoleColor BackgroundColor { get; }
}

public class LightTheme : ConsoleTheme
{
    public override ConsoleColor BackgroundColor
    {
        get
        {
            return ConsoleColor.Black;
        }
    }
}

用法:

public ConsoleTheme ct = new LightTheme();

我不确定你为什么要让它成为常数或​​静态。相反,您可以在启动时实例化正确的IConsoleThemePicker,并将此实例传递给任何需要它的类(手动或使用依赖注入)。这使它变得灵活且可测试。

 public interface IConsoleThemePicker
 {
      ConsoleTheme GetCurrentConsoleTheme();
 }

 public class DefaultConsoleThemePicker : IConsoleThemePicker
 {
      public ConsoleTheme GetCurrentConsoleTheme();
 }

用法:

 public class SomeClass
 {
      private readonly IConsoleThemePicker _consoleThemePicker;
      public SomeClass(IConsoleThemePicker consoleThemePicker)
      {
           _consoleThemePicker = consoleThemePicker;
      }
      public void SomeMethod()
      {
           var theme = _consoleThemePicker.GetCurrentConsoleTheme();
           // use theme
      }
 }

答案 1 :(得分:1)

除了已经说过的内容之外,您可能希望有一种简单的方法来选择主题,例如您使用颜色或画笔(即Brushes.Red)。

您可以这样做:

static class ConsoleThemes
{
    public static readonly ConsoleTheme Light = new LightTheme();
    public static readonly ConsoleTheme Dark = new DarkTheme();   
}

那么你可以说:

var theme = ConsoleThemes.Light;

答案 2 :(得分:0)

我认为您需要创建LightTheme类的实例,因为它不是静态的。

答案 3 :(得分:0)

无法将类实例分配到const字段。您必须创建一个实例并将其分配给static readonly字段。

public static readonly ConsoleTheme ConsoleTheme = new LightTheme();

虽然拥有只读主题听起来不错:)

答案 4 :(得分:0)

因为它是一个类,所以你需要创建该类的一个对象才能使用它。

使用new关键字创建对象,如此。

public const ConsoleTheme theme = new LightTheme();