ในตัวอย่างโค้ดต่อไปนี้เรามีคลาสสำหรับวัตถุที่ไม่เปลี่ยนรูปซึ่งแสดงถึงห้อง ทิศเหนือทิศใต้ทิศตะวันออกและทิศตะวันตกเป็นตัวแทนออกไปสู่ห้องอื่น
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 #
ฉันพยายามเขียนโค้ดเกมผจญภัยที่ใช้ข้อความเป็นหลัก แต่ใช้หลักการเขียนโปรแกรมเชิงหน้าที่เพื่อประโยชน์ในการเรียนรู้ ฉันติดอยู่กับแนวคิดนี้และสามารถใช้ความช่วยเหลือบางอย่าง !!! ขอบคุณ
UPDATE:
นี่คือการใช้งานตามคำตอบของ 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
ใน Haskell ที่ฉันเขียนไว้ด้านบน