C# 子类唯一静态变量:由父类声明,由子类初始化,以及自动克隆的静态方法

C# 子类唯一静态变量:由父类声明,由子类初始化,以及自动克隆的静态方法,c#,inheritance,static,C#,Inheritance,Static,我试图为子类设置一种访问静态变量的方法,以便在静态方法中使用 下面是一些代码,概述了我需要支持的结构类型 抽象类形状{ 静态抽象内侧面; 公共静态形状CreateFromFile(字符串文件名){ …从文件中读取多个面,并返回相应的形状。。 } } 类别:形状{ 静态内部侧=5; } 六角类:形状{ 静态内部侧=6; } 这不会编译,因为不支持静态抽象字段或属性。我发现更改子类构造函数中的值将更改原始值,因为没有为新类创建静态字段的副本,所以这不是一个选项 除了以非静态的形式重写之外,这里还有

我试图为子类设置一种访问静态变量的方法,以便在静态方法中使用

下面是一些代码,概述了我需要支持的结构类型

抽象类形状{
静态抽象内侧面;
公共静态形状CreateFromFile(字符串文件名){
…从文件中读取多个面,并返回相应的形状。。
}
}
类别:形状{
静态内部侧=5;
}
六角类:形状{
静态内部侧=6;
}
这不会编译,因为不支持静态抽象字段或属性。我发现更改子类构造函数中的值将更改原始值,因为没有为新类创建静态字段的副本,所以这不是一个选项


除了以非静态的形式重写之外,这里还有其他选择吗?这需要大量重复的代码,因为这些方法没有任何特定于类的功能。

更新

可以在子类中使用
new
关键字有意隐藏父静态属性。在父抽象类中抛出
NotImplementedException
,这样可以欺骗编译器,使其不允许在接口中使用静态属性(但是接口强制执行编译时检查)。请检查以下代码:

class Program
{
    static void Main(string[] args)
    {
        Rectangle.Sides = 4;
        Pentagon.Sides = 5;
        Console.WriteLine(Rectangle.Sides); // 4
        Console.WriteLine(Pentagon.Sides); // 5
        Console.WriteLine(Circle.Sides); // Throws NotImplementedException
        Console.WriteLine(Triangle.Sides); // Throws NotImplementedException
    } 
}

public abstract class Shape
{
    public static int Sides { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } }
}

public class Rectangle : Shape
{
    public new static int Sides { get; set; }
}

public class Pentagon : Shape
{
    public new static int Sides { get; set; }
}


public class Circle : Shape
{ // Circle does not have sides
}

public class Triangle : Shape
{
    // We forget to implement the Sides property
}

我假设使用
sides
字段的静态方法是
CreateFromFile
方法,它实际上是一个工厂方法。我建议使用如下工厂模式:

public interface Shape
{
    int Sides { get; }
}

public class Rectangle : Shape
{
    public int Sides { get { return 4; } }
}

public class Pentagon : Shape
{
    public int Sides { get { return 5; } }
}

public class ShapeFactory
{
    public static Shape CreateFromFile(string path)
    {
        // your logic to create the shapes
    }
}

GetNumberOfSides
属性添加到基类。每个实现类都可以根据自己的需要实现它。这会是额外的工作吗?是的-但我猜不会超过10分钟。也可以使用泛型(因为
静态
将限定为泛型的类型)-但我认为我的第一个建议更简单,更容易理解。不清楚您在这里尝试做什么。首先,为什么你甚至想要一个抽象的静态?所以不管怎样,把它作为静态的对我来说没有意义。@mjwills这是我曾经尝试过的一种解决方案,但是由于每个类的实现都是相同的,我希望有一种更干净的方法来实现这一点。我认为你选择的答案没有我的建议那么干净。我真的没有想过要为它建立一个单独的工厂。但这仍然没有完全解决静态问题。奇怪的是,在本例中,对于要创建的每个五边形,五边形的边数始终为5,因此需要一个非静态变量。这还阻止使用该属性来确定要创建的形状,例如,
if(Rectangle.sides==loadedInteger)返回新矩形()抛出一个新实现的异常是一个我没有想到的聪明的解决方法。我认为理想情况下,它可以在编译时找到,但它仍然强制执行与抽象变量类似的结构。谢谢