Tôi chuyển một số lượng mã hợp lý từ một nền tảng hỗ trợ các lớp cơ sở trừu tượng sang Swift và chạy vào đây rất nhiều. Nếu điều bạn thực sự muốn là chức năng của một lớp cơ sở trừu tượng, thì điều đó có nghĩa là lớp này đóng vai trò là một triển khai của chức năng lớp dựa trên chia sẻ (nếu không nó sẽ chỉ là một giao diện / giao thức) VÀ nó định nghĩa các phương thức phải được thực hiện bởi các lớp dẫn xuất.
Để làm điều đó trong Swift, bạn sẽ cần một giao thức và lớp cơ sở.
protocol Thing
{
func sharedFunction()
func abstractFunction()
}
class BaseThing
{
func sharedFunction()
{
println("All classes share this implementation")
}
}
Lưu ý rằng lớp cơ sở thực hiện (các) phương thức được chia sẻ, nhưng không thực hiện giao thức (vì nó không thực hiện tất cả các phương thức).
Sau đó, trong lớp dẫn xuất:
class DerivedThing : BaseThing, Thing
{
func abstractFunction()
{
println("Derived classes implement this");
}
}
Lớp dẫn xuất kế thừa sharedFunction từ lớp cơ sở, giúp nó đáp ứng phần đó của giao thức và giao thức vẫn yêu cầu lớp dẫn xuất thực hiện trừu tượng.
Nhược điểm thực sự duy nhất của phương thức này là vì lớp cơ sở không thực hiện giao thức, nếu bạn có một phương thức lớp cơ sở cần truy cập vào một thuộc tính / phương thức giao thức, bạn sẽ phải ghi đè lên lớp dẫn xuất và từ đó gọi lớp cơ sở (thông qua siêu) đi qua self
để lớp cơ sở có một thể hiện của giao thức để thực hiện công việc của nó.
Ví dụ: giả sử rằng sharedFunction cần thiết để gọi trừu tượng. Giao thức sẽ giữ nguyên và các lớp bây giờ sẽ như sau:
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");
}
}
Bây giờ, hàm chia sẻ từ lớp dẫn xuất đang đáp ứng phần đó của giao thức, nhưng lớp dẫn xuất vẫn có thể chia sẻ logic lớp cơ sở theo cách đơn giản hợp lý.