การเขียนโปรแกรม D - นามแฝง
นามแฝงเนื่องจากชื่ออ้างถึงให้ชื่ออื่นสำหรับชื่อที่มีอยู่ ไวยากรณ์ของนามแฝงแสดงอยู่ด้านล่าง
alias new_name = existing_name;
ต่อไปนี้เป็นไวยากรณ์ที่เก่ากว่าในกรณีที่คุณอ้างอิงตัวอย่างรูปแบบที่เก่ากว่า ไม่ควรใช้อย่างยิ่งในการใช้สิ่งนี้
alias existing_name new_name;
นอกจากนี้ยังมีไวยากรณ์อื่นที่ใช้กับนิพจน์และมีการระบุไว้ด้านล่างซึ่งเราสามารถใช้ชื่อนามแฝงแทนนิพจน์ได้โดยตรง
alias expression alias_name ;
ดังที่คุณทราบแล้ว typedef เพิ่มความสามารถในการสร้างประเภทใหม่ นามแฝงสามารถทำงานของ typedef และอื่น ๆ ได้อีกมากมาย ตัวอย่างง่ายๆสำหรับการใช้นามแฝงแสดงอยู่ด้านล่างซึ่งใช้ส่วนหัว std.conv ซึ่งให้ความสามารถในการแปลงประเภท
import std.stdio;
import std.conv:to;
alias to!(string) toString;
void main() {
int a = 10;
string s = "Test"~toString(a);
writeln(s);
}
เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานจะให้ผลลัพธ์ดังนี้ -
Test10
ในตัวอย่างข้างต้นแทนที่จะใช้ to! string (a) เรากำหนดให้เป็นนามแฝง name toString ทำให้สะดวกและเข้าใจง่ายขึ้น
นามแฝงสำหรับ Tuple
ให้เราดูตัวอย่างอื่นที่เราสามารถตั้งชื่อนามแฝงสำหรับทูเพิล
import std.stdio;
import std.typetuple;
alias TypeTuple!(int, long) TL;
void method1(TL tl) {
writeln(tl[0],"\t", tl[1] );
}
void main() {
method1(5, 6L);
}
เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานจะให้ผลลัพธ์ดังนี้ -
5 6
ในตัวอย่างข้างต้นประเภททูเปิลถูกกำหนดให้กับตัวแปรนามแฝงและทำให้นิยามวิธีการและการเข้าถึงตัวแปรง่ายขึ้น การเข้าถึงแบบนี้จะมีประโยชน์ยิ่งขึ้นเมื่อเราพยายามนำสิ่งเหล่านี้มาใช้ซ้ำ
นามแฝงสำหรับประเภทข้อมูล
หลายครั้งเราอาจกำหนดประเภทข้อมูลทั่วไปที่ต้องใช้ในแอปพลิเคชัน เมื่อโปรแกรมเมอร์หลายคนเขียนโค้ดแอปพลิเคชันอาจเป็นกรณีที่บุคคลหนึ่งใช้ int อีกคู่หนึ่งและอื่น ๆ เพื่อหลีกเลี่ยงความขัดแย้งดังกล่าวเรามักใช้ชนิดสำหรับประเภทข้อมูล ตัวอย่างง่ายๆแสดงไว้ด้านล่าง
ตัวอย่าง
import std.stdio;
alias int myAppNumber;
alias string myAppString;
void main() {
myAppNumber i = 10;
myAppString s = "TestString";
writeln(i,s);
}
เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานจะให้ผลลัพธ์ดังนี้ -
10TestString
นามแฝงสำหรับตัวแปรคลาส
มักจะมีข้อกำหนดที่เราจำเป็นต้องเข้าถึงตัวแปรสมาชิกของซูเปอร์คลาสในคลาสย่อยซึ่งสามารถทำได้โดยใช้นามแฝงอาจอยู่ภายใต้ชื่ออื่น
ในกรณีที่คุณยังใหม่กับแนวคิดเรื่องคลาสและการสืบทอดให้ดูบทช่วยสอนเกี่ยวกับคลาสและการสืบทอดก่อนที่จะเริ่มในส่วนนี้
ตัวอย่าง
ตัวอย่างง่ายๆแสดงไว้ด้านล่าง
import std.stdio;
class Shape {
int area;
}
class Square : Shape {
string name() const @property {
return "Square";
}
alias Shape.area squareArea;
}
void main() {
auto square = new Square;
square.squareArea = 42;
writeln(square.name);
writeln(square.squareArea);
}
เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานจะให้ผลลัพธ์ดังนี้ -
Square
42
นามแฝงนี้
นามแฝงนี้ให้ความสามารถในการแปลงประเภทอัตโนมัติของประเภทที่ผู้ใช้กำหนดเอง ไวยากรณ์แสดงอยู่ด้านล่างซึ่งมีการเขียนนามแฝงของคีย์เวิร์ดไว้ที่ด้านใดด้านหนึ่งของตัวแปรสมาชิกหรือฟังก์ชันสมาชิก
alias member_variable_or_member_function this;
ตัวอย่าง
ตัวอย่างแสดงไว้ด้านล่างเพื่อแสดงพลังของนามแฝงนี้
import std.stdio;
struct Rectangle {
long length;
long breadth;
double value() const @property {
return cast(double) length * breadth;
}
alias value this;
}
double volume(double rectangle, double height) {
return rectangle * height;
}
void main() {
auto rectangle = Rectangle(2, 3);
writeln(volume(rectangle, 5));
}
ในตัวอย่างข้างต้นคุณจะเห็นว่ารูปสี่เหลี่ยมผืนผ้าโครงสร้างถูกแปลงเป็นค่าสองเท่าด้วยความช่วยเหลือของนามแฝงวิธีนี้
เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานจะให้ผลลัพธ์ดังนี้ -
30