c# - 两个相关继承层次结构的OOAD(游戏组件)

标签 c# inheritance interface abstract-class class-hierarchy

我正在做一些 OO 分析来找出游戏组件之间的关系,这样我就可以设计类了。 我最终会使用 C#。

要求

我的游戏将包括:

棋子:方 block 、卡片、筹码

地方:网格、堆栈

可能的棋子放置:

  • block 可以放在网格上(需要网格,x,y)
  • 卡片可以堆叠放置(需要堆叠、位置)
  • 计数器可以放在网格上(需要网格,x,y)
  • 计数器也可以放在堆栈的顶部(需要堆栈、位置)

分析

  1. 作为接口(interface) (IPiece) 或抽象类 (Piece) 的 Piece。 (哪个最好?)
  2. Block、Card 和 Counter 作为 IPiece 或 Piece 子类的实现。
  3. 作为接口(interface) (IPlace) 或抽象类 (Place) 放置。 (哪个最好?)
  4. Grid 和 Stack 作为 IPlace 或 Place 子类的实现。

然后我就糊涂了...

每一件作品都有一个位置,所以那里有一种关系。 这是一对一的关系,因为每件作品都必须有一个且只有一个位置。

但我如何确保 block 只能放在网格上,卡片只能放在堆栈上,而计数器只能放在任何一个上?

在此先感谢您的帮助。

最佳答案

But how do I ensure that Blocks can only go on grids, Cards only on stacks and Counters on either?

您可以利用泛型和 generic type constraints在编译时执行这些规则

public interface IPiece<TPlace> where TPlace : IPlace
{
    TPlace Place { get; }

    void PlaceOn(TPlace place);
}

public class Block : IPiece<Grid>
{
    private Grid _place;

    public Grid Place
    {
        get { return _place; }
    }

    public void PlaceOn(Grid place)
    {
        _place = place;
    }
}

关于c# - 两个相关继承层次结构的OOAD(游戏组件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29606582/

相关文章:

c# - 为什么 EF 核心中的 [Timestamp] 列由 byte[] 列而不是 UInt64 支持

java - 如何防止接口(interface)在继承类中实现?

Java界面设计: interface vs boolean method

c# - 让 PostSharp 帮助记录 IF 语句

c# - 将数据从 ip 套接字转发到蓝牙套接字。 C#

c# - 确定正则表达式是否只是文字匹配

php - 管理一个应用的多个专业版本的最佳实践

php - 如何在php中实现鸡鸡蛋鸟类接口(interface)问题

java - java中基于父类(super class)和子类对泛型类型的多重限制

java - 如何最好地测试 Java 代码?