নিম্নলিখিত কোড উদাহরণে, আমাদের অবিচ্ছিন্ন অবজেক্টের জন্য একটি শ্রেণি রয়েছে যা একটি ঘরকে উপস্থাপন করে। উত্তর, দক্ষিণ, পূর্ব এবং পশ্চিম অন্যান্য কক্ষে প্রবেশের প্রতিনিধিত্ব করে।
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; }
}
সুতরাং আমরা দেখতে পাই, এই শ্রেণিটি একটি প্রতিবিম্বিত বিজ্ঞপ্তি সংক্রান্ত রেফারেন্স সহ ডিজাইন করা হয়েছে। তবে শ্রেণিটি অপরিবর্তনীয় বলে আমি 'মুরগী বা ডিম' সমস্যার সাথে আটকে আছি। আমি নিশ্চিত যে অভিজ্ঞ ফাংশনাল প্রোগ্রামাররা জানেন যে এটি কীভাবে কাজ করে। এটি সি # তে কীভাবে পরিচালনা করা যায়?
আমি একটি পাঠ্য-ভিত্তিক অ্যাডভেঞ্চার গেম কোড করার চেষ্টা করছি, তবে কেবল শেখার খাতিরে ক্রিয়ামূলক প্রোগ্রামিং নীতিগুলি ব্যবহার করছি। আমি এই ধারণায় আটকে আছি এবং কিছু সহায়তা ব্যবহার করতে পারি !!! ধন্যবাদ।
হালনাগাদ:
অলস সূচনা সংক্রান্ত মাইক নাকিসের উত্তরের উপর ভিত্তি করে এখানে একটি কার্যকরী বাস্তবায়ন রয়েছে:
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
শ্রেণির সংজ্ঞা এবং কটির মিল রয়েছে তা দেখুন List
।