C# 课堂互动

C# 课堂互动,c#,class,simulation,C#,Class,Simulation,好的,我在做一个关于“购物中心”的模拟,我有很多类在同一个“级别”,对应每个人的个性。 例如,我的职业是:小丑、小偷、刺客、唯物主义者等 还有一个叫客户的父亲班。在客户端类中,我有一些吃东西、走路等的方法,每个特定的类都有一个特定的方法,小偷偷东西、刺客杀人等等。 我想知道如何将每个“客户机”放在一个列表中,并且仍然强制转换每个特定的方法?这将需要一个运行时强制转换。您可以将列表键入为list,并在访问列表时进行转换。然而,这并不是一个特别坚实的设计。我想问,如果您的客户机差异很大,您需要在运行

好的,我在做一个关于“购物中心”的模拟,我有很多类在同一个“级别”,对应每个人的个性。 例如,我的职业是:小丑、小偷、刺客、唯物主义者等 还有一个叫客户的父亲班。在客户端类中,我有一些吃东西、走路等的方法,每个特定的类都有一个特定的方法,小偷偷东西、刺客杀人等等。
我想知道如何将每个“客户机”放在一个列表中,并且仍然强制转换每个特定的方法?

这将需要一个运行时强制转换。您可以将列表键入为
list
,并在访问列表时进行转换。然而,这并不是一个特别坚实的设计。我想问,如果您的客户机差异很大,您需要在运行时强制转换它们,那么为什么要使用继承呢。

也许您应该这样做:

public abstract class Client
{
    public void Eat() { /* some implementation */ }
    public void Walk() { /* some implementation */ }
    public abstract void TypeSpecificAction();
}

public class Thief
{
    public overeride void TypeSpecificAction() { Steal(); }
    public void Steal() { /* some implementation */ }
}

public class Assassin
{
    public overeride void TypeSpecificAction() { Assassinate(); }
    public void Assassinate() { /* some implementation */ }
}

不过,这只适用于某些有限的情况。一般来说,这个问题的解决方案是向下转换,正如usr回答的那样。

我试图将每个客户机都放在客户机列表中,但这不起作用,所以我仍然可以使用每个特定的方法。你可以在客户机接口上进行更通用的调用,例如“SpecialAction”。你肯定应该使用接口。例如,在接口IMovementProvider之外使用一些方法,比如IPOPLE或IArchetype,等等。您应该真正检查Head-First设计模式。它们所经历的情况与你在这里遇到的情况几乎相同,只是有鸭子(偶尔还有火鸡)。你们可以访问books.google.com上的很多内容