ฉันเห็นโค้ดชิ้นนี้:
var request = (HttpWebRequest) WebRequest.Create("http://www.google.com");
ทำไมต้องแคส(HttpWebRequest)
? ทำไมไม่ใช้HttpWebRequest.Create
? แล้วทำไมถึงHttpWebRequest.Create
สร้างWebRequest
ไม่ใช่ a HttpWebRequest
?
ฉันเห็นโค้ดชิ้นนี้:
var request = (HttpWebRequest) WebRequest.Create("http://www.google.com");
ทำไมต้องแคส(HttpWebRequest)
? ทำไมไม่ใช้HttpWebRequest.Create
? แล้วทำไมถึงHttpWebRequest.Create
สร้างWebRequest
ไม่ใช่ a HttpWebRequest
?
คำตอบ:
วิธีการเป็นแบบคงที่และมีอยู่เฉพาะในCreate
WebRequest
เรียกมันว่าเป็นHttpWebRequest.Create
ที่แตกต่างกันอาจจะดู WebRequest.Create
แต่รวบรวมจริงลงไปเรียก ดูเหมือนจะเป็นHttpWebRequest
เพราะมรดกเท่านั้น
Create
วิธีการภายในใช้รูปแบบโรงงานที่จะทำการสร้างที่เกิดขึ้นจริงของวัตถุที่อยู่บนพื้นฐานของUri
คุณผ่านไป คุณสามารถรับวัตถุอื่น ๆ กลับคืนมาได้เช่น a FtpWebRequest
หรือFileWebRequest
ขึ้นอยู่กับไฟล์Uri
.
WebRequest
เป็นคลาสนามธรรมซึ่งมีวิธีการโรงงานCreate
ที่สร้างอินสแตนซ์ของคลาสย่อยที่เป็นรูปธรรมขึ้นอยู่กับ URL ที่ส่งเข้ามา ไม่ว่าคุณจะต้องการหรือต้องการ
HttpWebRequest httpreq = (HttpWebRequest)WebRequest.Create(strUrl);
แทนที่จะ
WebRequest req = WebRequest.Create(strUrl);
ขึ้นอยู่กับความต้องการของคุณและประเภทของ URL ที่คุณส่งผ่าน
หากคุณเพียง แต่ผ่านใน HTTP: URL แล้วรหัสอดีตช่วยให้คุณสามารถเข้าถึงคุณสมบัติและวิธีการประเภทรองดำเนินการนอกเหนือไปจากที่กำหนดไว้ในชั้นฐานHttpWebRequest
WebRequest
แต่ถ้าคุณส่ง FTP: URL ความพยายามในการส่งHttpWebRequest
จะล้มเหลว
ประเภทหลังเป็นแบบทั่วไปและจะไม่ล้มเหลวในประเภทของ URL ที่รองรับ แต่แน่นอนว่าหากไม่มีการแคสต์ไปยังคลาสย่อยใด ๆ คุณสามารถเข้าถึงคุณสมบัติและวิธีการที่คลาสฐานกำหนดเท่านั้น
- ผ่าน Martin Honnen
การแคสต์จำเป็นเฉพาะเมื่อคุณต้องการเข้าถึงสมาชิกเฉพาะของ HttpWebRequest แนวคิดก็คือหากคุณสมบัติ / วิธีการที่รองรับบน WebRequest เพียงพอคุณสามารถเขียนแอปพลิเคชันที่จะทำงานกับโปรโตคอลการร้องขอ / การตอบกลับหลายประเภท ในกรณีนี้ URI อาจเป็นสิ่งที่ผู้ใช้กำหนดโดยใช้โปรโตคอลที่รองรับโดยโปรโตคอลแบบเสียบได้ สามารถรองรับโปรโตคอลใหม่ได้โดยไม่ต้องเปลี่ยนแปลงซอฟต์แวร์ดั้งเดิม
หากแอปพลิเคชันของคุณต้องการการควบคุมเพิ่มเติมสำหรับคุณสมบัติเฉพาะสำหรับโปรโตคอลเฉพาะคุณสามารถ จำกัด requestUri ไว้ที่โครงร่างที่รองรับของคุณและส่ง WebRequest ไปยังคลาสย่อยเฉพาะโปรโตคอลที่เหมาะสม ซึ่งจะ จำกัด โปรโตคอลที่แอปพลิเคชันของคุณรองรับ แต่ช่วยให้คุณสามารถปรับแต่งคุณสมบัติเฉพาะของโปรโตคอลได้