Trong ví dụ mã sau đây, chúng ta có một lớp dành cho các đối tượng bất biến đại diện cho một căn phòng. Bắc, Nam, Đông và Tây đại diện cho lối ra vào các phòng khác.
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; }
}
Vì vậy, chúng ta thấy, lớp này được thiết kế với một tham chiếu vòng tròn phản xạ. Nhưng vì lớp học không thay đổi, tôi bị mắc kẹt với vấn đề 'con gà hoặc quả trứng'. Tôi chắc chắn rằng các lập trình viên có kinh nghiệm biết cách giải quyết vấn đề này. Làm thế nào nó có thể được xử lý trong C #?
Tôi đang nỗ lực để viết mã một trò chơi phiêu lưu dựa trên văn bản, nhưng sử dụng các nguyên tắc lập trình chức năng chỉ vì mục đích học tập. Tôi bị mắc kẹt trong khái niệm này và có thể sử dụng một số trợ giúp !!! Cảm ơn.
CẬP NHẬT:
Đây là một triển khai hoạt động dựa trên câu trả lời của Mike Nakis về khởi tạo lười biếng:
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
ví dụ của bạn cũng vậy .
type List a = Nil | Cons of a * List a
. Và một cây nhị phân : type Tree a = Leaf a | Cons of Tree a * Tree a
. Như bạn có thể thấy, cả hai đều tự tham chiếu (đệ quy). Đây là cách bạn xác định phòng của bạn : type Room = Nil | Open of {name: string, south: Room, east: Room, north: Room, west: Room}
.
Room
lớp bạn và a List
trong Haskell tôi đã viết ở trên.