আমি কেবলমাত্র আমার শ্রেণীর সংজ্ঞায় প্রয়োজনীয় জিনিসগুলি (সঞ্চিত বৈশিষ্ট্য, প্রারম্ভিককরণের) রাখি এবং অন্য সমস্ত কিছুকে তাদের নিজের মধ্যে স্থানান্তরিত করি extension
, যেমন extension
লজিক ব্লকের প্রতি আমি // MARK:
পাশাপাশি গ্রুপ করব like
উদাহরণস্বরূপ একটি ইউআইভিউউ সাবক্লাসের জন্য, আমি লেআউট-সম্পর্কিত স্টাফগুলির জন্য একটি এক্সটেনশন দিয়ে শেষ করব, ইভেন্টগুলি সাবস্ক্রাইব এবং পরিচালনা করার জন্য এবং এর বাইরেও। এই এক্সটেনশানগুলিতে, আমাকে অবশ্যম্ভাবীভাবে কিছু 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
। এটি আমার কাছে কিছুটা বোঝায় না। আমি প্রোটোকল এক্সটেনশানগুলি স্থিতিশীলভাবে প্রেরণ করা সম্পর্কে পড়েছি, তবে এটি কোনও প্রোটোকল নয়। এটি একটি নিয়মিত শ্রেণি, এবং আমি আশা করি যে রানটাইমের সময় পদ্ধতি কলগুলি গতিশীলভাবে প্রেরণ করা হবে। স্পষ্টত কলটি 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
। এখানে আমি কোনও উপায়েই ইউআইভিউ-র লেআউটসুভিউগুলি গতিশীল করতে পারি না।
উভয় ওভাররাইডগুলিকে তাদের শ্রেণীর ঘোষণায় স্থানান্তর করা আমাদের A A A
আবার ফিরে আসে, কেবলমাত্র A বা কেবলমাত্র বি এর এখনও আমাদের পাওয়া যায় A B A
। dynamic
আবার আমার সমস্যাগুলি সমাধান করে।
তত্ত্বের মধ্যে আমি যা করতে চাই সবগুলিতে যোগ dynamic
করতে override
পারি তবে আমার মনে হয় আমি এখানে অন্য কিছু করছি।
extension
আমার মতো গ্রুপিং কোডের জন্য এস ব্যবহার করা কি সত্যিই ভুল ?