我有一个Movement
类作为我的对象的属性。
我想要做的只是能够为此属性设置确定的值,例如:
class Movement
{
public Direction Moving;
public Direction Facing;
}
Movement movement = new Movement():
movement.Moving = Direction.Up;
movement.Facing = Direction.Down;
我可以使Direction.Up/Down/Left/Right
为常量字符串,但我不希望能够为该属性设置任何不是Direction.Up / Down / Left / Right'的内容。
但我不知道如何制作Direction
课程。
答案 0 :(得分:2)
答案 1 :(得分:0)
您可以使用枚举并像这样使用它:
FILTER
但是,现在如果你想对方向做一些操作,或者做一些计算,你就不能在Direction中实现它,因为它是枚举。
您还可以创建一个抽象类Direction,并使实际方向从Direction派生,如下所示:
public enum Direction {
1 = Up,
2 = Right,
3 = Down,
4 = Left
}
public class UseDirection {
public Direction Dir { public get; private set; }
public void SetDirection(Direction dir) {
Dir = dir;
}
}
现在您可以像这样使用public abstract class Direction {
private class DirectionUp : Direction { }
private class DirectionDown : Direction { }
private class DirectionLeft : Direction { }
private class DirectionRight : Direction { }
public static Direction Up => new DirectionUp();
public static Direction Down => new DirectionDown();
public static Direction Left => new DirectionLeft();
public static Direction Right => new DirectionRight();
}
:
Direction
这种模式很不错,因为你现在可以只使用public class AggregatesDirection {
public Direction Dir { public get; private set; }
public AggregatesDirection() {
Dir = Direction.Up; //uses the static property in Direction that will use the private constructor of the private class in Direction.
}
}
接口来完成与方向相关的所有东西,并且仍然有不同的实现方式,比如说,你可以为某个方向重新定位一些东西。不同的方向类。
您也可以将类设置为公共和抽象Direction类之外,但是您可以将类型公开给命名空间,这可能不是必需的。
答案 2 :(得分:0)
我想通了,这就是我的诀窍:
public class Direction
{
private string value;
private Direction(string value)
{
switch (value)
{
case "left":
{
this.value = value;
break;
}
case "right":
{
this.value = value;
break;
}
case "up":
{
this.value = value;
break;
}
case "down":
{
this.value = value;
break;
}
default:
throw new Exception("Valor invalido");
}
}
public static class Directions
{
public static Direction Up = new Direction("up");
public static Direction Down = new Direction("down");
public static Direction Left = new Direction("left");
public static Direction Right = new Direction("right");
}
}
我将“Direction”类设为public,但它的构造函数为private,因此它只能在其自身及其子项中实例化,然后在其中创建静态类“Directions”。
所以我很容易:
this.directionMoving = Direction.Directions.Down;
this.directionLooking = Direction.Directions.Down;
我的代码中的任何地方,但不能:
Direction move = new Direction();
因为它的构造函数只能在其自身内部访问。