ฉันโอนรหัสจำนวนพอสมควรจากแพลตฟอร์มที่รองรับคลาสพื้นฐานแบบนามธรรมไปยัง Swift และทำงานในสิ่งนี้เป็นจำนวนมาก หากสิ่งที่คุณต้องการอย่างแท้จริงคือการทำงานของคลาสพื้นฐานที่เป็นนามธรรมนั่นหมายความว่าคลาสนี้ทำหน้าที่เป็นทั้งการใช้งานฟังก์ชันคลาสที่ใช้ร่วมกัน (มิฉะนั้นจะเป็นเพียงอินเทอร์เฟซ / โปรโตคอล) และจะกำหนดวิธีการที่ต้องดำเนินการโดย คลาสที่ได้รับ
ในการทำเช่นนั้นใน Swift คุณจะต้องมีโปรโตคอลและคลาสพื้นฐาน
protocol Thing
{
func sharedFunction()
func abstractFunction()
}
class BaseThing
{
func sharedFunction()
{
println("All classes share this implementation")
}
}
โปรดสังเกตว่าคลาสพื้นฐานใช้เมธอดที่ใช้ร่วมกัน แต่ไม่ได้ใช้โปรโตคอล (เนื่องจากไม่ได้ใช้วิธีการทั้งหมด)
จากนั้นในคลาสที่ได้รับ:
class DerivedThing : BaseThing, Thing
{
func abstractFunction()
{
println("Derived classes implement this");
}
}
คลาสที่ได้รับสืบทอด sharedFunction จากคลาสฐานช่วยให้ตอบสนองส่วนนั้นของโปรโตคอลและโปรโตคอลยังคงต้องการคลาสที่ได้รับมาเพื่อใช้ abstractFunction
ข้อเสียที่แท้จริงเพียงอย่างเดียวของวิธีนี้คือเนื่องจากคลาสพื้นฐานไม่ได้ใช้โปรโตคอลหากคุณมีเมธอดคลาสพื้นฐานที่ต้องการเข้าถึงคุณสมบัติ / วิธีการโปรโตคอลคุณจะต้องแทนที่สิ่งนั้นในคลาสที่ได้รับและจากนั้นการเรียกใช้ คลาสพื้นฐาน (ผ่านซุปเปอร์) self
เพื่อให้คลาสฐานมีอินสแตนซ์ของโปรโตคอลที่จะทำงาน
ตัวอย่างเช่นสมมติว่า sharedFunction จำเป็นในการเรียก abstractFunction โปรโตคอลจะยังคงเหมือนเดิมและชั้นเรียนจะมีลักษณะดังนี้:
class BaseThing
{
func sharedFunction(thing: Thing)
{
println("All classes share this implementation")
thing.abstractFunction()
}
}
class DerivedThing : BaseThing, Thing
{
func sharedFunction()
{
super.sharedFunction(self)
}
func abstractFunction()
{
println("Derived classes implement this");
}
}
ตอนนี้ sharedFunction จากคลาสที่ได้รับนั้นเป็นที่พอใจในส่วนนั้นของโปรโตคอล แต่คลาสที่ได้รับยังคงสามารถแบ่งปันตรรกะของคลาสพื้นฐานได้อย่างตรงไปตรงมา