Dalam contoh kode berikut, kami memiliki kelas untuk objek yang tidak dapat diubah yang mewakili ruangan. Utara, Selatan, Timur, dan Barat mewakili pintu keluar ke kamar lain.
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; }
}
Jadi kita lihat, kelas ini dirancang dengan referensi lingkaran refleksif. Tetapi karena kelasnya tidak berubah, saya terjebak dengan masalah 'ayam atau telur'. Saya yakin bahwa programmer fungsional yang berpengalaman tahu bagaimana menghadapi ini. Bagaimana bisa ditangani dalam C #?
Saya berusaha keras untuk membuat kode game petualangan berbasis teks, tetapi menggunakan prinsip pemrograman fungsional hanya untuk tujuan pembelajaran. Saya terjebak pada konsep ini dan dapat menggunakan bantuan !!! Terima kasih.
MEMPERBARUI:
Berikut ini adalah implementasi yang bekerja berdasarkan jawaban Mike Nakis mengenai inisialisasi malas:
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
contoh Anda .
type List a = Nil | Cons of a * List a
. Dan pohon biner: type Tree a = Leaf a | Cons of Tree a * Tree a
. Seperti yang Anda lihat, mereka berdua merujuk pada diri sendiri (rekursif). Berikut adalah bagaimana Anda akan mendefinisikan kamar Anda: type Room = Nil | Open of {name: string, south: Room, east: Room, north: Room, west: Room}
.
Room
kelas Anda dan a List
dalam Haskell yang saya tulis di atas.