【发布时间】: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,并为其提供默认实现。
标签: c# inheritance static abstract-class