ฉันมักจะใส่เฉพาะความจำเป็น (คุณสมบัติที่เก็บไว้, ตัวเริ่มต้น) ลงในคำจำกัดความของคลาสของฉันและย้ายทุกสิ่งทุกอย่างไปเป็นของตัวเองextension
ซึ่งเหมือนกับextension
บล็อกตรรกะที่ฉันจะจัดกลุ่มด้วย// MARK:
เช่นกัน
สำหรับคลาสย่อย UIView ฉันจะปิดท้ายด้วยส่วนขยายสำหรับสิ่งที่เกี่ยวข้องกับการจัดวางส่วนหนึ่งสำหรับการสมัครรับข้อมูลและจัดการเหตุการณ์และอื่น ๆ ในส่วนขยายเหล่านี้ผมอย่างหลีกเลี่ยงไม่ได้ที่จะแทนที่วิธี UIKit layoutSubviews
บางส่วนเช่น ฉันไม่เคยสังเกตเห็นปัญหาใด ๆ เกี่ยวกับแนวทางนี้ - จนถึงวันนี้
ใช้ลำดับชั้นของคลาสนี้เช่น:
public class C: NSObject {
public func method() { print("C") }
}
public class B: C {
}
extension B {
override public func method() { print("B") }
}
public class A: B {
}
extension A {
override public func method() { print("A") }
}
(A() as A).method()
(A() as B).method()
(A() as C).method()
ผลลัพธ์คือA B C
. ที่ไม่ค่อยมีเหตุผลสำหรับฉัน ฉันอ่านเกี่ยวกับ Protocol Extensions ที่ถูกส่งแบบคงที่ แต่นี่ไม่ใช่โปรโตคอล นี่เป็นคลาสปกติและฉันคาดว่าการเรียกเมธอดจะถูกส่งแบบไดนามิกที่รันไทม์ เห็นได้ชัดว่าการโทรC
อย่างน้อยควรมีการส่งและผลิตแบบไดนามิกC
หรือไม่?
ถ้าฉันลบการสืบทอดNSObject
และสร้างC
คลาสรูทคอมไพเลอร์จะบ่นว่าdeclarations in extensions cannot override yet
ซึ่งฉันได้อ่านไปแล้ว แต่การมีNSObject
คลาสรูทเปลี่ยนสิ่งต่าง ๆ อย่างไร?
การย้ายการลบล้างทั้งสองไปสู่การประกาศคลาสของพวกเขาก่อให้เกิดA A A
ตามที่คาดไว้การย้ายเฉพาะการB
ผลิตการA B B
ย้ายเพียงการA
สร้างC B C
เท่านั้นซึ่งสุดท้ายก็ไม่สมเหตุสมผลสำหรับฉัน: แม้แต่การพิมพ์แบบคงที่เพื่อA
สร้างA
เอาต์พุตอีกต่อไป!
การเพิ่มdynamic
คีย์เวิร์ดในนิยามหรือการแทนที่ดูเหมือนจะทำให้ฉันมีพฤติกรรมที่ต้องการ 'จากจุดนั้นในลำดับชั้นลงไป' ...
ลองเปลี่ยนตัวอย่างของเราเป็นสิ่งที่สร้างน้อยลงสิ่งที่ทำให้ฉันโพสต์คำถามนี้:
public class B: UIView {
}
extension B {
override public func layoutSubviews() { print("B") }
}
public class A: B {
}
extension A {
override public func layoutSubviews() { print("A") }
}
(A() as A).layoutSubviews()
(A() as B).layoutSubviews()
(A() as UIView).layoutSubviews()
A B A
ตอนนี้เราได้รับ ที่นี่ฉันไม่สามารถสร้าง layoutSubviews แบบไดนามิกของ UIView ได้ด้วยวิธีใด ๆ
ย้ายทั้งแทนที่เข้าสู่การประกาศคลาสของพวกเขาได้รับเราA A A
อีกครั้งเพียงเท่านั้นหรือ B A B A
ยังคงได้รับเรา dynamic
แก้ปัญหาของฉันได้อีกครั้ง
ตามทฤษฎีแล้วฉันสามารถเพิ่มdynamic
ทุกสิ่งoverride
ที่ฉันเคยทำ แต่ฉันรู้สึกว่าฉันทำอะไรผิดพลาดที่นี่
การใช้extension
s ในการจัดกลุ่มโค้ดอย่างที่ฉันทำผิดจริงๆหรือ?