トラックを生成しているトラックビルダー(私の将来のレースゲーム用)を開発しています。構築後、トラックはゲームエンジンなどで処理されます。トラックは可能要素のコレクション、次のとおりです。長いストレート 従属要素の一連の工場
各要素は、トラックのを構築している間に生成されなければならないlengthプロパティを、持っている/
- 短いです素子。要素は世代中の以前のものに依存しています(遅いものの後に速い角を持つのはちょっと奇妙です)。
public class ElementType { ... public double GenerateLength() { switch (m_TypeEnum) { case ElementTypeEnum.SlowSpeedCorner: return Parameters.SlowCornerAvgLength+Generator.GetDeviation; ... case ElementTypeEnum.LongStraight: default: return Parameters.LongStraightAvgLength + Generator.GetDeviation(Parameters.LongStraightLengthMaxDeviation); } } ... public IList<ElementType> GetPossibleSuccessors() { switch (m_TypeEnum) { case ElementTypeEnum.SlowSpeedCorner: return new List<ElementType>() { new ElementType(ElementTypeEnum.SlowSpeedCorner), new ElementType(ElementTypeEnum.ShortStraight), new ElementType(ElementTypeEnum.LongStraight) }; ... case ElementTypeEnum.LongStraight: default: return new List<ElementType>() { new ElementType(ElementTypeEnum.SlowSpeedCorner), new ElementType(ElementTypeEnum.MediumSpeedCorner), new ElementType(ElementTypeEnum.FastSpeedCorner) }; } } } public enum ElementTypeEnum : int { LongStraight = 1, SlowSpeedCorner = 2, }
と発電機がオンに基づかれた方法:私は「ifing」の解決のために行ってきました初めて
public static TrackElement GenerateElement(TrackElement Predecessor) { ElementType type = SelectElementType(Predecessor); double length = type.GenerateLength(); return new TrackElement(type, length); } private static ElementType SelectElementType(TrackElement Predecessor) { IList<ElementType> successors = Predecessor.Type.GetPossibleSuccessors(); int possibleSuccessors = successors.Count; int selected = Generator.GetInt(possibleSuccessors); return successors[selected]; }
しかし、あなたが推測できるように、これはドラマですエンジンでそれを消費するとき - すべての財産の結果としてあまりにも多くの "ifing"。だから私は上基づか異なるクラスに要素を移動:
public abstract class TrackElement { public TrackElement(double Length) { m_length = Length; } protected abstract static double GenerateLength(); public sealed double Length { get { return m_length; } } }
をしかし、今、私は提供されるクラスを使用して、建物のトラックに問題があります。もちろん
public static TrackElement GenerateElement(TrackElement Predecessor) { ??? type = SelectElementType(Predecessor); double length = type.GenerateLength(); return new ???(length); }
を私はGenerateLengthので、このように行うことができないことを知っています私は自分の問題を起草したかっただけです。どうすればこれを達成できますか?