【问题标题】:C# Design Regarding Static Classes and Inheritence关于静态类和继承的 C# 设计
【发布时间】:2016-04-14 08:40:59
【问题描述】:

我正在用 C# 设计一个纸牌游戏。每张卡片都是 Card 类的一个实例,它包含两个属性:卡片的唯一 ID 和对 CardData 对象的引用。 CardData 类型的对象实现了有关Card 如何在游戏规则中发挥作用的方法。许多卡片(例如,如果有多个梅花 J)可以引用相同的卡片数据。

public class Card {
    public int id;
    public CardData card;
}

我的问题是关于我应该如何实现CardData 类。我的第一直觉是设计一个抽象基类CardData,其中包含WhenPlayed()WhenRemoved() 之类的一堆方法,然后为实现它们的每张卡都有一个子类。

public abstract class CardData () {
    public abstract void WhenPlayed();
    public abstract void WhenRemoved();
}

public class JackOfClubs : CardData () {
    public override void WhenPlayed()  { 
        Console.WriteLine( "You played a Jack of Clubs!" );
    }
    public override void WhenRemoved() {
        Console.WriteLine( "Bye for now" );
    }
}

但是,由于我从不想实际实例化 JackOfClubs 对象,而是实例化 Cards 并为它们提供对 JackOfClubs 类的引用,因此将 CardData 类和所有子类static。这会产生一个问题,因为据我所知静态类不能继承。

此外,我考虑过使用interface,但我想要默认方法的可能性。例如,如果我的 90% 的 CardData 对象将 WhenRemoved() 实现为“Bye for now”,那么为每个子类重新键入它会很烦人。我可以使用非抽象的CardData 类来实现这一点,但不能使用接口。

我的问题是,如果有这样的类结构,那么处理此类结构的最佳或正确方法是什么。

【问题讨论】:

  • “但是,由于我从不想实际实例化 JackOfClubs 对象,而是实例化 Cards 并为它们提供对 JackOfClubs 类的引用,因此将 CardData 类和所有子类静态。” 你确实实例化了JackOfClubs。如果不这样做,您将无法将其传递给您的 Card 对象。我不明白这对static 有什么好处。
  • 我想你是对的。那么单例方法最有意义吗?我从不希望有多个 JackOfClubs,因为每个 JackOfClubs 的规则都是相同的,并且多个实例化会很浪费。
  • 我仍然会将它设为实例类,但只实例化一次。此外,您可以将WhenRemoved 方法设为virtual 而不是abstract,并为其提供默认实现。
  • Here's a repository on github where someone has modeled the data structures for a card game using standard playing cards。它与您描述的方法不匹配,但无论如何您可能会觉得它很有趣。

标签: c# inheritance static abstract-class


【解决方案1】:

我会做这样的设计please refer the diagram,这样你就不会像卡片一样多创建类,本质上它们是同一类的不同对象。所以我们有一个工厂,它拥有一个名为 Cards 的自定义集合,它是具有类型和值的 Card 类的集合。您可以根据卡片的类型和价值来实现播放方法。如果您正在玩一个不涉及所有卡牌的游戏,这种设计就可以正常工作,如果您将其扩展到多个卡牌游戏,如果您再添加一个类卡类别,则该设计包含如下:好吧。希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2016-10-06
    • 2022-08-20
    • 2017-01-19
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多