静态抽象类

Dav*_*jak 9 c# static derived-class

我需要一种方法来创建一个静态类,其中一些常量可以是特定于案例的,但是是硬编码的.

我真正想做的是有一个类,当类扩展时提供了几个常量 - 我希望'常量'是硬编码的.我想我将制作一些抽象属性并定义get {return constant; 当扩展类时.

我知道这是不可能的,所以现在我面临两个选择,我想知道什么是最好的和为什么(如果有我缺少的选项,请告诉我!)

  1. 创建一个具有可空字段的静态类,如果在调用静态方法时字段为null,则抛出异常.
  2. 放弃静态类.拥有一个带有抽象属性的非静态类,并在我需要的任何地方创建一个对象实例,即使所有功能都是静态的.

我知道这可能是主观的,并且取决于案例,但是当我考虑这个问题时我会绕圈子,并且可以通过一些外部输入来实现.加上我希望可能没有做我想做的事情,而我只是在考虑这个错误.

更新:代码:我将尝试编写一些描述我想要完成的代码.我知道这段代码不行!

想象一下,抽象类Calculation在一个dll中,被许多项目使用.所有这些功能都是相同的,只是常量因项目而异.

public abstract static class Calculation
{
    private abstract int Constant { get; }    //The constant is unknown at this time

    public static int Calculate(int inputValue)
    {
        return inputValue * Constant;
    }
}
Run Code Online (Sandbox Code Playgroud)

Calc类是在一个单独的项目中定义的,其中需要功能并且Constant已知.

public static class Calc : Calculation
{
    private override int Constant { get { return 2; }
}

...

static class Program
{
    [STAThread]
    static void Main()
    {
        //At some point:
        int result = Calc.Calculate(6);
    }
}
Run Code Online (Sandbox Code Playgroud)

我想最简单的方法是创建一个非静态类并创建一个实例,但是我担心这个类的几个实例可能很昂贵,并希望在可能的情况下防止它.

我不知道如何在不在每个项目中再次编写单独模式的情况下将其写为单例模式 - 在dll 中只有Nested类.这并不妨碍实现者只创建一个普通的类,并且可能会为每个使用代码的项目重新开始辩论.

更新#2:我选择的选项是:

dll中的类:

public static class Calculation 
{
    public int? Constant {get; set;}

    public static int Calculate(int inputValue)
    {
        if (Constant == null)
            throw new ArgumentNullException();

        return inputValue * (int)Constant;
    }
}
Run Code Online (Sandbox Code Playgroud)

在单独的项目中使用该函数:

static class Program
{
    [STAThread]
    static void Main()
    {
        //At some point:
        Calculation.Constant = 2;
        int result = Calc.Calculate(6);
    }
}
Run Code Online (Sandbox Code Playgroud)

选项一非常简单和优雅,令我困扰的是没有任何东西迫使实现者设置常量.我担心一种(不可否认的)不可能的情况,一个模糊的角落案件将导致财产不被设置,并且代码失败(并且Constant成为最后一个嫌疑人)......

Joa*_* VR 6

您可以创建遵循单例的非静态类,确保只存在一个对象实例.我想这可能是下一个最好的事情.


Vde*_*edT 5

你不能同时想要静态和继承!它确实是有意义的!

如果需要覆盖行为,则需要继承!

如果你想要简单的调用(静态的一个优点),你可以使用Factory(如果只需要一个实例,则使用单例)

我的猜测是你可能不得不重新考虑你的模型.你的这组常量可能代表你可以在一个单独的类中提取的东西,然后将这个类传递给你的静态方法.这符合你的需求吗?