다음 코드 예제에는 방을 나타내는 불변 객체에 대한 클래스가 있습니다. 북쪽, 남쪽, 동쪽 및 서쪽은 다른 방으로 나가는 출구를 나타냅니다.
public sealed class Room
{
public Room(string name, Room northExit, Room southExit, Room eastExit, Room westExit)
{
this.Name = name;
this.North = northExit;
this.South = southExit;
this.East = eastExit;
this.West = westExit;
}
public string Name { get; }
public Room North { get; }
public Room South { get; }
public Room East { get; }
public Room West { get; }
}
따라서이 클래스는 재귀 순환 참조로 설계되었습니다. 그러나 클래스가 변경 불가능하기 때문에 '치킨 또는 계란'문제가 있습니다. 숙련 된 기능 프로그래머가이 문제를 어떻게 처리하는지 알고 있습니다. C #에서 어떻게 처리 할 수 있습니까?
텍스트 기반 어드벤처 게임을 코딩하려고 노력하고 있지만 학습을 위해 기능적 프로그래밍 원칙을 사용하고 있습니다. 나는이 개념을 고수하고 도움을 사용할 수 있습니다! 감사.
최신 정보:
게으른 초기화에 관한 Mike Nakis의 답변을 기반으로 작동하는 구현은 다음과 같습니다.
using System;
public sealed class Room
{
private readonly Func<Room> north;
private readonly Func<Room> south;
private readonly Func<Room> east;
private readonly Func<Room> west;
public Room(
string name,
Func<Room> northExit = null,
Func<Room> southExit = null,
Func<Room> eastExit = null,
Func<Room> westExit = null)
{
this.Name = name;
var dummyDelegate = new Func<Room>(() => { return null; });
this.north = northExit ?? dummyDelegate;
this.south = southExit ?? dummyDelegate;
this.east = eastExit ?? dummyDelegate;
this.west = westExit ?? dummyDelegate;
}
public string Name { get; }
public override string ToString()
{
return this.Name;
}
public Room North
{
get { return this.north(); }
}
public Room South
{
get { return this.south(); }
}
public Room East
{
get { return this.east(); }
}
public Room West
{
get { return this.west(); }
}
public static void Main(string[] args)
{
Room kitchen = null;
Room library = null;
kitchen = new Room(
name: "Kitchen",
northExit: () => library
);
library = new Room(
name: "Library",
southExit: () => kitchen
);
Console.WriteLine(
$"The {kitchen} has a northen exit that " +
$"leads to the {kitchen.North}.");
Console.WriteLine(
$"The {library} has a southern exit that " +
$"leads to the {library.South}.");
Console.ReadKey();
}
}
Room
예도 마찬가지입니다 .
type List a = Nil | Cons of a * List a
입니다. 그리고 이진 트리 : type Tree a = Leaf a | Cons of Tree a * Tree a
. 보시다시피, 둘 다 자기 참조 적 (재귀 적)입니다. 방을 정의하는 방법은 다음과 같습니다 type Room = Nil | Open of {name: string, south: Room, east: Room, north: Room, west: Room}
..
Room
클래스와 a 의 정의가 얼마나 유사한 지 살펴보십시오 List
.