【发布时间】:2013-12-04 10:21:24
【问题描述】:
给定一个基类Coin
public class Coin { }
还有两个派生类Coin50Cent和Coin25Cent
public class Coin50 : Coin { }
public class Coin25 : Coin { }
任务是创建一个CoinMachine 的对象(用于硬币交换,例如投入 50 美分硬币返回两个 25 美分硬币),它对应于以下要求:
CoinMachine必须有两个Coin25Cent和Coin50cent对象集合。-
集合必须派生自具有两个方法的抽象泛型类
CoinStack<T>void Push(T item); T Pop(); CoinMachine必须按以下方式工作CoinMachine.Push(new Coin25()); // puts 25cent in 25c stack CoinMachine.Push(new Coin50()); // puts 50cent in 50c stack CoinMachine.Pop(); // gets 50cent from 50c stack CoinMachine.Pop(); // gets 25cent from 25c stack
这是我的实现 好像我在抽象 CoinStack 类中的转换有问题。
namespace ConsoleApplication1
{
/* Given condition */
class Program
{
static void Main(string[] args)
{
CoinMachine.Push(new Coin25());
CoinMachine.Push(new Coin50());
CoinMachine.Pop<Coin50>();
CoinMachine.Pop<Coin25>();
}
}
public class Coin { }
public class Coin50 : Coin { }
public class Coin25 : Coin { }
/* End given condition */
public interface ICoinStack
{
T Pop<T>();
void Push<T>(T item);
}
/* The problem within this abstract class */
public abstract class CoinStack<T> : ICoinStack
{
private Queue<T> _stack = new Queue<T>();
public T Pop<T>() { return _stack.Dequeue(); }
public void Push<T>(T item) { _stack.Enqueue(item); }
}
public class CoinStack50 : CoinStack<Coin50> { }
public class CoinStack25 : CoinStack<Coin25> { }
public class CoinMachine
{
private static Dictionary<Type, ICoinStack> map;
static CoinMachine()
{
map = new Dictionary<Type, ICoinStack>()
{
{ typeof(Coin50), new CoinStack50() },
{ typeof(Coin25), new CoinStack25() }
};
}
public static T Pop<T>()
{
var type = typeof(T);
return map[type].Pop<T>();
}
public static void Push<T>(T item)
{
var type = typeof(T);
map[type].Push(item);
}
}
}
【问题讨论】:
-
我建议您在
CoinStack<T>上使用类型约束,如下所示:CoinStack<T> where T: Coin。您还必须在CoinMachine.Push和Pop方法上添加相同的内容。这将增加代码的类型安全性,但我怀疑它是否能解决问题。 -
您可以只保留
Coin的集合,而不是它们的派生类型。然后您可以做的是将您的Coin25和Coin50对象推送到该堆栈,然后将它们作为它们的实际超类型检索。 -
@aevitas,我认为 OP 是故意这样做的,因为他/她需要每种硬币类型的单独收藏
-
@Ivaylo Slavov,aevitas 感谢您的回复,但 Ivaylo Slavov 绝对正确。 CoinMachine 必须包含每种硬币类型的单独集合。