我有一系列对象,让我们称之为建筑物,每个对象共享某些属于该建筑物的静态属性,但每个建筑物都有不同的属性,例如价格.我认为实现这个的最好方法是创建一个带有共享价格属性的抽象超类,并在每个子类中设置值,但我无法弄清楚如何使其工作.这是我尝试过的一个例子:
using System;
public abstract class Buildings
{
internal static int price;
internal static int turnsToMake;
}
Run Code Online (Sandbox Code Playgroud)
using System;
public class Walls : Buildings
{
public Walls()
{
price = 200;
turnsToMake = 5;
}
}
Run Code Online (Sandbox Code Playgroud)
这适用于构造,但如果我想在创建之前检查价格(检查玩家是否有足够的钱),那么它只返回一个空值.我确信这是一个非常简单的修复,但我无法弄清楚.有帮助吗?
有一个"零散"但简单的解决方案值得考虑.如果将基类定义为Generic类,并且在派生类中将T设置为类本身,它将起作用.
发生这种情况是因为.NET为每个新定义静态定义了一种新类型.
例如:
class Base<T>
{
public static int Counter { get; set; }
public Base()
{
}
}
class DerivedA : Base<DerivedA>
{
public DerivedA()
{
}
}
class DerivedB : Base<DerivedB>
{
public DerivedB()
{
}
}
class Program
{
static void Main(string[] args)
{
DerivedA.Counter = 4;
DerivedB.Counter = 7;
Console.WriteLine(DerivedA.Counter.ToString()); // Prints 4
Console.WriteLine(DerivedB.Counter.ToString()); // Prints 7
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
不要用static.Static表示Building的所有实例都具有相同的值.派生类不会继承自己的静态副本; 但总是会修改基类静态.在您的设计中,只有一个价格和turnToMake值.
这应该适合你:
public abstract class Buildings
{
internal int price;
internal int turnsToMake;
}
Run Code Online (Sandbox Code Playgroud)
但是,现在大多数人不喜欢使用字段而更喜欢属性.
public abstract class Buildings
{
internal int Price { get; set; }
internal int TurnsToMake { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2505 次 |
| 最近记录: |