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)返回新矩形()代码>抛出一个新实现的异常是一个我没有想到的聪明的解决方法。我认为理想情况下,它可以在编译时找到,但它仍然强制执行与抽象变量类似的结构。谢谢