Bir konseptin (karakter komutları gibi), kodunun içinde veri olarak iletip işleyebileceğin bir veri temsilini oluşturmak, programlamada yaygın şekilde kullanılan bir yoldur. Bu mini oyunda komutların, kullanıcı arayüzü etkileşiminden üretilecek ve bunları uygulayacak olan karaktere iletilecek veriler olarak ele alınması gerekir.
Bu projede, komutlar bir soyut sınıf olarak temsil edilir ve forward_command ve turnright_command örneğinde olduğu gibi her belirli komut, bu command sınıfının bir alt sınıfını oluşturur. Komut için bir soyut sınıfın kullanılması, geçerli komutların yalnızca soyut olmayan alt sınıflar olacağı anlamına gelir. Doğrudan command sınıfının bir örneğini oluşturmaya çalışırsan kodunu derlemeye çalıştığında hata alırsın.
Karakter komutları command sınıfının alt sınıfları olduğundan, bunları karakterin bir önceki adımda yer alan ExecuteCommand() fonksiyonu gibi command sınıfının beklendiği her yerde kullanabilirsin. ExecuteCommand() fonksiyonundaki birinci parametre komut türünü bekler. Bu özellik, bir command alt sınıfı örneğini bağımsız değişken olarak sorunsuz bir şekilde kullanabileceğin anlamına gelir.
Her alt sınıf, kendi DebugString() uygulamasını sağlar, böylece bir komut değerini yazdırdığında kendisiyle ilişkili doğru metne sahip olur ancak gerekirse sınıflara daha fazla farklılık ekleyebilirsin.
Bu sınıflar aynı zamanda unique belirticisine de sahiptir, böylece sınıfların örneklerini karşılaştırabiliriz. Bu belirtici, onları karşılaştırılabilir kılar.
Bu sınıflar aynı zamanda computes belirticisine de sahiptir, böylece örneklerini modül kapsamının içinde (doğrudan Commands modülünde) oluşturabilirsin. Bu, her komutu temsil etmek için tek bir benzersiz örnek oluşturabileceğimiz anlamına gelir; örneğin, ileri komutu için Commands.Forward.
Bu örnek, enum türü yerine komut alt sınıflarının örneklerini kullanır; bu nedenle sonradan başka alt sınıflar oluşturarak daha fazla komut ekleyebilirsin. Bir enum türüyle, projenin ilk yayınlanan sürümünden sonra onu değiştiremez veya enum’a daha fazla değer ekleyemezsin; bu nedenle, projeni yayınladıktan sonra verilerinin değişmesini beklemiyorsan enum türü daha uygun olacaktır.
Komut uygulaması için tam kod aşağıdaki gibidir.
# This file contains the data representation of all the commands that the NPC can receive
# and utilities for the data to help with debugging and troubleshooting issues.
# Each type of command that the NPC can perform will be an instance of this class.
# The class has the unique specifier to make instances of the class comparable.
# The class has the computes specifier to be able to instantiate it at module-scope.
# The class has the abstract specifier so it cannot be instantiated directly, and
# requires subclasses to implement any non-initialized functions, like DebugString().
command := class<computes><unique><abstract>:
DebugString():string
Sonraki Adım
Komutları tanımladık ve istediğin kadar komutu nasıl ekleyebileceğini gördük.
Sonraki adımda, bu komutların kullanıcı arayüzünde nasıl kullanıldığını ve karakteri kontrol etmek için özel bir kullanıcı arayüzünün nasıl ekleneceğini öğreneceksin.