การเขียนโปรแกรม 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