c# - 如何制作抽象静态属性

标签 c# static abstract

我知道这可以通过使用接口(interface)为方法完成。但是接口(interface)不能有字段或静态属性(这无济于事,因为它会为实现该接口(interface)的所有类指定一个值)。我还可以为抽象类的属性设置默认值。但理想情况下,我想强制每个继承类实现这些属性的值。这些值仍然可以在抽象类级别的抽象方法中使用。

每个属性的好处:
- 抽象的;基类要求实现此属性,但未指定值。
- 静止的;每种实现类型只存储一个值,而不是每个对象。

public interface IPiece
{
    readonly int Points;
    readonly char Letter;
}

public abstract class Piece
{
    public static readonly int Points;
    public static readonly char Letter;
}

public class King : Piece, IPiece
{
    public int Points = 0;
    public int Letter = 'K';
}

最佳答案

解决这个问题的标准模式是:

public interface IPiece
{
    int Points { get; }
    char Letter { get; }
}

public class King : IPiece
{
    public int Points => 0;
    public char Letter => 'K';
}

根本不需要使用 static,因为 0K 是文字,因此(像 static) 每个类只有效存储一次。

另请注意,我已经删除了您的抽象类 - 它没有用处,因为其中没有逻辑。没有逻辑的抽象类在概念上等同于接口(interface)(您已经拥有),因此在这个阶段没有必要。

如果你真的想使用static那么你可以使用:

public class King : IPiece
{
    private static int points = 0;
    private static char letter = 'K';

    public int Points => points;
    public char Letter => letter;
}

但这并没有什么大的好处。

关于c# - 如何制作抽象静态属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53640237/

相关文章:

reactjs - 在静态服务器上使用 React Router 托管 React 应用程序

java - java中的静态方法,我可以以非静态方式访问静态方法吗?

c# - 为什么 C# 接口(interface)方法没有声明为抽象或虚拟?

python - 什么是python中的抽象类?

c# - OOGenerics 设计注意事项

c# - 我应该使用什么作为虚拟等待?

c# - 通过mysql导出Gridview数据

c# - 具有多个分隔符的条件分割字符串

c - GCC 中静态变量的符号是如何命名的?

java - 为什么Iterable接口(interface)中的forEach方法不是抽象的?