সুইফট এক্সটেনশনে ওভাররাইডিং পদ্ধতি


133

আমি কেবলমাত্র আমার শ্রেণীর সংজ্ঞায় প্রয়োজনীয় জিনিসগুলি (সঞ্চিত বৈশিষ্ট্য, প্রারম্ভিককরণের) রাখি এবং অন্য সমস্ত কিছুকে তাদের নিজের মধ্যে স্থানান্তরিত করি 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 Adynamicআবার আমার সমস্যাগুলি সমাধান করে।

তত্ত্বের মধ্যে আমি যা করতে চাই সবগুলিতে যোগ dynamicকরতে overrideপারি তবে আমার মনে হয় আমি এখানে অন্য কিছু করছি।

extensionআমার মতো গ্রুপিং কোডের জন্য এস ব্যবহার করা কি সত্যিই ভুল ?


এক্সটেনশনগুলি এভাবে ব্যবহার করা হ'ল সুইফ্টের জন্য কনভেনশন। এমনকি অ্যাপল এটি স্ট্যান্ডার্ড লাইব্রেরিতে করে।
আলেকজান্ডার - মনিকা পুনরায়


1
@ এমমচিলভ আপনি যে ডকুমেন্টটি প্রোটোকল সম্পর্কে আলোচনা করেছেন তাতে কি আমি কিছু মিস করছি?
খ্রিস্টান শ্নোনার

আমি সন্দেহ করি এটি একই মেকানিজম যা উভয়ের জন্যই কাজ করে
আলেকজান্ডার - মিনিকা

3
সাবক্লাস এক্সটেনশনে ওভাররাইড পদ্ধতিতে ডুপ্লিকেট সুইফট প্রেরণে উপস্থিত হয় । ম্যাট-এর উত্তরটি হ'ল এটি একটি বাগ (এবং সেটিকে সমর্থন করার জন্য তিনি ডক্সকে উদ্ধৃতি দিয়েছেন)।
jscs

উত্তর:


229

এক্সটেনশনগুলি ওভাররাইড করতে পারে না।

অ্যাপলের সুইফট গাইডে ডকুমেন্ট হিসাবে এক্সটেনশনে কার্যকারিতা (বৈশিষ্ট্য বা পদ্ধতিগুলির মতো) ওভাররাইড করা সম্ভব নয়।

এক্সটেনশনগুলি কোনও ধরণের নতুন কার্যকারিতা যুক্ত করতে পারে তবে তারা বিদ্যমান কার্যকারিতা ওভাররাইড করতে পারে না।

সুইফট বিকাশকারী গাইড

সংকলক আপনাকে উদ্দেশ্য-সি এর সাথে সামঞ্জস্য করার জন্য এক্সটেনশনে ওভাররাইড করার অনুমতি দিচ্ছে। তবে এটি আসলে ভাষার নির্দেশনা লঙ্ঘন করছে।

"এটি আমাকে আইজাক অসিমভের" রোবোটিকের তিনটি আইন "এর কথা মনে করিয়ে দিয়েছে 🤖

এক্সটেনশানগুলি ( সিনট্যাকটিক চিনি ) তাদের নিজস্ব যুক্তি গ্রহণকারী স্বাধীন পদ্ধতিগুলি সংজ্ঞায়িত করে। অর্থাৎ যে ফাংশনটির জন্য ডাকা layoutSubviewsহয় কোডটি সংকলক কখন সংকলকটি সম্পর্কে জানায় তা নির্ভর করে depends ইউআইভিউ ইউআরআইএসপন্ডার থেকে উত্তরাধিকার সূত্রে প্রাপ্ত যা এনএসবজেক্টের উত্তরাধিকার সূত্রে তাই এক্সটেনশানটিতে ওভাররাইড অনুমোদিত তবে তা হওয়া উচিত নয়

সুতরাং গোষ্ঠীকরণের সাথে কোনও সমস্যা নেই তবে আপনার ক্লাসে ওভাররাইড করা উচিত এক্সটেনশনে নয়।

নির্দেশিকা নোট

আপনি কেবল overrideএকটি সুপারক্লাস পদ্ধতি করতে পারেন অর্থাত্ত load() initialize()একটি সাবক্লাসের একটি এক্সটেনশনে যদি পদ্ধতিটি উদ্দেশ্য-সি সামঞ্জস্যপূর্ণ হয়।

সুতরাং এটি আপনাকে কেন ব্যবহার করে সংকলন করতে দিচ্ছে তা আমরা একবার খেয়াল করতে পারি layoutSubviews

সমস্ত সুইফট অ্যাপ্লিকেশনগুলি কেবলমাত্র সুইফট-র রানটাইমকে মঞ্জুরি দেয় এমন খাঁটি সুইফট-কেবল ফ্রেমওয়ার্ক ব্যবহার না করেই ওজেক্টিভ-সি রানটাইমের অভ্যন্তরে কার্যকর করা হয়।

যেহেতু আমরা জানতে পেরেছি উদ্দেশ্য-সি রানটাইম সাধারণত দুটি শ্রেণীর প্রধান পদ্ধতি কল করে load()এবং initialize()স্বয়ংক্রিয়ভাবে আপনার অ্যাপ্লিকেশনটির প্রক্রিয়াগুলিতে ক্লাস শুরু করার সময়।

dynamicসংশোধক সম্পর্কিত Regarding

থেকে অ্যাপল ডেভেলপার লাইব্রেরী (archive.org)

dynamicঅবজেক্টিভ-সি রানটাইমের মাধ্যমে সদস্যদের অ্যাক্সেসকে গতিশীলভাবে প্রেরণ করাতে আপনি সংশোধকটি ব্যবহার করতে পারেন ।

যখন সুইফট এপিআইগুলি ওজেক্টিভ-সি রানটাইম দ্বারা আমদানি করা হয়, তখন বৈশিষ্ট্য, পদ্ধতি, সাবস্ক্রিপ্ট বা ইনিশিয়ালাইজারের জন্য গতিশীল প্রেরণের কোনও গ্যারান্টি নেই। উদ্দেশ্য কোড-সি রানটাইমকে বাইপাস করে সুইফট সংকলকটি এখনও আপনার কোডটির কার্যকারিতাটি অনুকূলকরণের জন্য সদস্যের অ্যাক্সেসটি ডেভেলচুয়ালাইজ করতে বা ইনলাইন করতে পারে। 😳

সুতরাং dynamicআপনার layoutSubviews-> এ প্রয়োগ করা যেতে পারে UIView Classযেহেতু এটি উদ্দেশ্য-সি দ্বারা প্রতিনিধিত্ব করা হয় এবং অবজেক্টিভ-সি রানটাইম ব্যবহার করে সেই সদস্যের অ্যাক্সেস সর্বদা ব্যবহৃত হয়।

এজন্য সংকলক আপনাকে ব্যবহার করতে দেয় overrideএবং dynamic


6
বর্ধিতকরণ কেবল শ্রেণিতে সংজ্ঞায়িত পদ্ধতিগুলিকে ওভাররাইড করতে পারে না। এটি প্যারেন্ট ক্লাসে সংজ্ঞায়িত পদ্ধতিগুলিকে ওভাররাইড করতে পারে।
আরজেই

-সুইফট 3-ওয়েল, এটি অদ্ভুত, কারণ আপনি ফ্রেমওয়ার্কগুলি অন্তর্ভুক্ত করে এর পদ্ধতিগুলিও আপনি ওভাররাইড করতে পারেন (এবং এখানে ওভাররাইডের মাধ্যমে আমি সুইজলিংয়ের মতো কিছু বোঝায়) methods এমনকি যদি frame ফ্রেমওয়ার্কগুলি খাঁটি দ্রুতগতিতে লেখা থাকে .... তবে ফ্রেমওয়ার্কগুলিও আপত্তি করতে বাধ্য এবং সে কারণেই 🤔
farzadshbfn

@tymac আমি এটি পাই না। অবজেক্টিভ-সি রানটাইমটির যদি উদ্দেশ্য-সি সামঞ্জস্যতার জন্য কিছু প্রয়োজন হয়, তবে সুইফ্ট সংকলকটি এখনও এক্সটেনশনে ওভাররাইডের অনুমতি দেয় কেন ? সিনট্যাক্স ত্রুটি হিসাবে সুইফট এক্সটেনশনে ওভাররাইডিংকে কীভাবে চিহ্নিত করা অবজেক্টিভ-সি রানটাইমকে ক্ষতি করতে পারে?
আলেকজান্ডার ভ্যাসেনিন

1
এত হতাশাজনক, তাই যখন আপনি ইতিমধ্যে কোনও প্রকল্পের কোড সহ একটি কাঠামো তৈরি করতে চান তখন আপনাকে সাবক্লাস করতে হবে এবং সমস্ত কিছুর নতুন নামকরণ করতে হবে ...
থাইবাট নঃ

3
@ অউরিস আপনার কোনও রেফারেন্স আছে?
রিচার্ডোপিরের

18

সুইফটের অন্যতম লক্ষ্য হ'ল স্থির প্রেরণ, বা বরং গতিশীল প্রেরণের হ্রাস of ওবজ-সি যদিও খুব গতিময় ভাষা। আপনি যে পরিস্থিতিটি দেখছেন তা 2 টি ভাষার ভাষা এবং তারা একসাথে কাজ করার উপায়ের মধ্যকার সংযোগ বহন করে। এটি সত্যই সংকলন করা উচিত নয়।

এক্সটেনশানগুলি সম্পর্কে একটি মূল বিষয় হ'ল সেগুলি প্রসারিত করার জন্য, প্রতিস্থাপন / ওভাররাইডিংয়ের জন্য নয়। নাম এবং ডকুমেন্টেশন উভয় থেকেই এটি পরিষ্কার যে এটি উদ্দেশ্য। আসলে আপনি যদি নিজের কোড থেকে ওবজ-সি-এর লিঙ্কটি বের করেন ( NSObjectসুপারক্লাস হিসাবে সরান ) এটি সংকলন করবে না।

সুতরাং, সংকলক স্থিতিশীলভাবে কী প্রেরণ করতে পারে এবং এটি কীভাবে গতিশীলভাবে প্রেরণ করতে পারে তা সিদ্ধান্ত নেওয়ার চেষ্টা করছে এবং আপনার কোডে ওবজ-সি লিঙ্কের কারণে এটি একটি ব্যবধানের মধ্যে পড়ছে। কারণ dynamic'কাজ' কারণ এটা OBJ-সি সবকিছুর উপর লিঙ্ক তাই এটি সব সবসময় গতিশীল এর অত্যাচার হচ্ছে।

সুতরাং, গোষ্ঠীকরণের জন্য এক্সটেনশনগুলি ব্যবহার করা ভুল নয়, এটি দুর্দান্ত তবে এক্সটেনশানগুলিতে ওভাররাইড করা ভুল wrong যে কোনও ওভাররাইডগুলি মূল শ্রেণিতে থাকা উচিত এবং এক্সটেনশন পয়েন্টগুলিতে কল করতে হবে।


এটিও ভেরিয়েবলের ক্ষেত্রে প্রযোজ্য? উদাহরণস্বরূপ, যদি আপনি ওভাররাইড করতে চান supportedInterfaceOrientationsমধ্যে UINavigationController(বিভিন্ন ওরিয়েন্টেশন বিভিন্ন মতামত দেখাচ্ছে উদ্দেশ্যে), আপনি একটি কাস্টম না বর্গ একটি এক্সটেনশন ব্যবহার করা উচিত? অনেক উত্তর ওভাররাইড করার জন্য একটি এক্সটেনশন ব্যবহার করার পরামর্শ দেয় supportedInterfaceOrientationsতবে স্পষ্টকরণ পছন্দ করবে। ধন্যবাদ!
ক্র্যাশলোট

10

সাবক্লাসে ওভাররাইড করার ক্ষমতা বজায় রেখে শ্রেণি স্বাক্ষর এবং বাস্তবায়নের (এক্সটেনশনে) পরিষ্কার বিচ্ছিন্নতা অর্জনের একটি উপায় রয়েছে। কৌশলটি হ'ল ফাংশনের জায়গায় ভেরিয়েবল ব্যবহার করা

আপনি যদি পৃথক সুইফট উত্স ফাইলে প্রতিটি সাবক্লাসটি সংজ্ঞায়িত করার বিষয়টি নিশ্চিত করে থাকেন তবে সংশ্লিষ্ট প্রয়োগগুলি পরিষ্কারভাবে এক্সটেনশনে সংগঠিত রেখে আপনি ওভাররাইডগুলির জন্য গণিত ভেরিয়েবলগুলি ব্যবহার করতে পারেন। এটি সুইফ্টের "বিধিগুলি" রোধ করবে এবং আপনার শ্রেণীর এপিআই / স্বাক্ষরটি একটি জায়গায় খুব সুন্দরভাবে সংগঠিত করবে:

// ---------- BaseClass.swift -------------

public class BaseClass
{
    public var method1:(Int) -> String { return doMethod1 }

    public init() {}
}

// the extension could also be in a separate file  
extension BaseClass
{    
    private func doMethod1(param:Int) -> String { return "BaseClass \(param)" }
}

...

// ---------- ClassA.swift ----------

public class A:BaseClass
{
   override public var method1:(Int) -> String { return doMethod1 }
}

// this extension can be in a separate file but not in the same
// file as the BaseClass extension that defines its doMethod1 implementation
extension A
{
   private func doMethod1(param:Int) -> String 
   { 
      return "A \(param) added to \(super.method1(param))" 
   }
}

...

// ---------- ClassB.swift ----------
public class B:A
{
   override public var method1:(Int) -> String { return doMethod1 }
}

extension B
{
   private func doMethod1(param:Int) -> String 
   { 
      return "B \(param) added to \(super.method1(param))" 
   }
}

প্রতিটি শ্রেণীর এক্সটেনশন প্রয়োগের জন্য একই পদ্ধতির নামগুলি ব্যবহার করতে সক্ষম হয় কারণ তারা ব্যক্তিগত এবং একে অপরের কাছে দৃশ্যমান নয় (যতক্ষণ না তারা পৃথক ফাইলে থাকে)।

যেমন আপনি উত্তরাধিকার দেখতে পাচ্ছেন (ভেরিয়েবলের নাম ব্যবহার করে) সুপার.ভেরিয়েবলের নাম ব্যবহার করে সঠিকভাবে কাজ করে

BaseClass().method1(123)         --> "BaseClass 123"
A().method1(123)                 --> "A 123 added to BaseClass 123"
B().method1(123)                 --> "B 123 added to A 123 added to BaseClass 123"
(B() as A).method1(123)          --> "B 123 added to A 123 added to BaseClass 123"
(B() as BaseClass).method1(123)  --> "B 123 added to A 123 added to BaseClass 123"

2
আমি অনুমান করি যে এটি আমার নিজস্ব পদ্ধতির জন্য কাজ করবে, তবে যখন আমার ক্লাসে সিস্টেম ফ্রেমওয়ার্ক পদ্ধতিগুলি ওভাররাইড করে না।
খ্রিস্টান শ্নোনার

এটি একটি সম্পত্তি মোড়কের শর্তসাপেক্ষে প্রোটোকল এক্সটেনশনের জন্য আমাকে সঠিক পথে নামিয়েছে। ধন্যবাদ!
ক্রিস প্রিন্স

1

এই জবাবটি ওপিকে লক্ষ্য করে না, তার বক্তব্য দ্বারা সাড়া দেওয়ার জন্য অনুপ্রেরণা বোধ করা ছাড়া অন্যটি বলেছিল, "আমি কেবলমাত্র প্রয়োজনীয় শ্রেণিগুলি (সঞ্চিত বৈশিষ্ট্য, প্রারম্ভিক) আমার শ্রেণির সংজ্ঞাগুলিতে রাখি এবং অন্য সমস্ত কিছুকে তাদের নিজস্ব বর্ধনে স্থানান্তরিত করি। .. "। আমি মূলত একজন সি # প্রোগ্রামার এবং সি # তে কেউ এই উদ্দেশ্যে আংশিক ক্লাস ব্যবহার করতে পারে। উদাহরণস্বরূপ, ভিজ্যুয়াল স্টুডিও একটি আংশিক বর্গ ব্যবহার করে একটি পৃথক উত্স ফাইলে UI- সম্পর্কিত স্টাফ রাখে এবং আপনার মূল উত্স ফাইলটি নিরবচ্ছিন্ন ছেড়ে দেয় যাতে আপনার এই বিভ্রান্তি না ঘটে।

আপনি যদি "সুইফ্ট আংশিক শ্রেণি" অনুসন্ধান করেন তবে আপনি বিভিন্ন লিঙ্ক পাবেন যেখানে সুইফট অনুসারীরা বলে যে সুইফটকে আংশিক শ্রেণীর প্রয়োজন নেই কারণ আপনি এক্সটেনশনগুলি ব্যবহার করতে পারেন। মজার বিষয় হল আপনি যদি গুগল অনুসন্ধান ক্ষেত্রে "সুইফট এক্সটেনশন" টাইপ করেন তবে এর প্রথম অনুসন্ধানের পরামর্শটি হ'ল "সুইফট এক্সটেনশন ওভাররাইড" এবং এই মুহুর্তে এই স্ট্যাক ওভারফ্লো প্রশ্নটি প্রথম হিট। আমি এটিকে বোঝাতে চাইছি যে ওভাররাইড ক্ষমতাগুলির (অভাবের) অভাবের সমস্যাগুলি স্যুইফট এক্সটেনশান সম্পর্কিত সম্পর্কিত সর্বাধিক অনুসন্ধান করা বিষয় এবং এই বিষয়টি হাইলাইট করে যে সুইফট এক্সটেনশনগুলি সম্ভবত আংশিক শ্রেণীর স্থান পরিবর্তন করতে পারে না, যদি আপনি অন্তর্ভূক্ত ক্লাসগুলি ব্যবহার করেন তবে আপনার প্রোগ্রামিং।

যাইহোক, একটি দীর্ঘ বায়ু প্রবর্তন সংক্ষিপ্তভাবে কাটাতে, আমি এমন পরিস্থিতিতে পড়েছিলাম যেখানে আমি আমার সি #-থেকে-সুইফ্ট প্রোগ্রামটি তৈরি করে যা সুইফ্ট ক্লাসগুলির জন্য মূল উত্স ফাইলগুলির বাইরে কিছু বয়লারপ্লেট / ব্যাগেজ পদ্ধতি সরিয়ে নিতে চেয়েছিলাম। এই পদ্ধতিগুলিকে এক্সটেনশানে স্থানান্তরিত করার পরে কোনও ওভাররাইডের অনুমতি না দেওয়ার সমস্যায় পড়ার পরে, আমি নিম্নলিখিত সহজ-মানসিকতার কাজটি বাস্তবায়ন করে শেষ করেছি। মূল সুইফট উত্স ফাইলগুলিতে এখনও কিছু ক্ষুদ্র স্টাব পদ্ধতি রয়েছে যা এক্সটেনশন ফাইলগুলিতে আসল পদ্ধতিগুলিকে কল করে এবং ওভাররাইড সমস্যা এড়াতে এই এক্সটেনশন পদ্ধতির অনন্য নাম দেওয়া হয়।

public protocol PCopierSerializable {

   static func getFieldTable(mCopier : MCopier) -> FieldTable
   static func createObject(initTable : [Int : Any?]) -> Any
   func doSerialization(mCopier : MCopier)
}

public class SimpleClass : PCopierSerializable {

   public var aMember : Int32

   public init(
               aMember : Int32
              ) {
      self.aMember = aMember
   }

   public class func getFieldTable(mCopier : MCopier) -> FieldTable {
      return getFieldTable_SimpleClass(mCopier: mCopier)
   }

   public class func createObject(initTable : [Int : Any?]) -> Any {
      return createObject_SimpleClass(initTable: initTable)
   }

   public func doSerialization(mCopier : MCopier) {
      doSerialization_SimpleClass(mCopier: mCopier)
   }
}

extension SimpleClass {

   class func getFieldTable_SimpleClass(mCopier : MCopier) -> FieldTable {
      var fieldTable : FieldTable = [ : ]
      fieldTable[376442881] = { () in try mCopier.getInt32A() }  // aMember
      return fieldTable
   }

   class func createObject_SimpleClass(initTable : [Int : Any?]) -> Any {
      return SimpleClass(
                aMember: initTable[376442881] as! Int32
               )
   }

   func doSerialization_SimpleClass(mCopier : MCopier) {
      mCopier.writeBinaryObjectHeader(367620, 1)
      mCopier.serializeProperty(376442881, .eInt32, { () in mCopier.putInt32(aMember) } )
   }
}

public class DerivedClass : SimpleClass {

   public var aNewMember : Int32

   public init(
               aNewMember : Int32,
               aMember : Int32
              ) {
      self.aNewMember = aNewMember
      super.init(
                 aMember: aMember
                )
   }

   public class override func getFieldTable(mCopier : MCopier) -> FieldTable {
      return getFieldTable_DerivedClass(mCopier: mCopier)
   }

   public class override func createObject(initTable : [Int : Any?]) -> Any {
      return createObject_DerivedClass(initTable: initTable)
   }

   public override func doSerialization(mCopier : MCopier) {
      doSerialization_DerivedClass(mCopier: mCopier)
   }
}

extension DerivedClass {

   class func getFieldTable_DerivedClass(mCopier : MCopier) -> FieldTable {
      var fieldTable : FieldTable = [ : ]
      fieldTable[376443905] = { () in try mCopier.getInt32A() }  // aNewMember
      fieldTable[376442881] = { () in try mCopier.getInt32A() }  // aMember
      return fieldTable
   }

   class func createObject_DerivedClass(initTable : [Int : Any?]) -> Any {
      return DerivedClass(
                aNewMember: initTable[376443905] as! Int32,
                aMember: initTable[376442881] as! Int32
               )
   }

   func doSerialization_DerivedClass(mCopier : MCopier) {
      mCopier.writeBinaryObjectHeader(367621, 2)
      mCopier.serializeProperty(376443905, .eInt32, { () in mCopier.putInt32(aNewMember) } )
      mCopier.serializeProperty(376442881, .eInt32, { () in mCopier.putInt32(aMember) } )
   }
}

যেমন আমি আমার পরিচিতিতে বলেছিলাম, এটি আসলে ওপি-র প্রশ্নের উত্তর দেয় না, তবে আমি আশা করছি যে এই সাধারণ-চিন্তার কাজটি অন্যদের জন্য সহায়ক হতে পারে যারা মূল উত্স ফাইলগুলি থেকে পদ্ধতিগুলি এক্সটেনশন ফাইলগুলিতে স্থানান্তর করতে চান এবং কোনটিতে যেতে চান না -উভারাইড সমস্যা


1

এক্সটেনশনে ফাংশনগুলিকে ওভাররাইড করতে পিওপি (প্রোটোকল-ওরিয়েন্টেড প্রোগ্রামিং) ব্যবহার করুন।

protocol AProtocol {
    func aFunction()
}

extension AProtocol {
    func aFunction() {
        print("empty")
    }
}

class AClass: AProtocol {

}

extension AClass {
    func aFunction() {
        print("not empty")
    }
}

let cls = AClass()
cls.aFunction()

1
এটি ধরে নিয়েছে যে প্রোগ্রামারটি AClass এর মূল সংজ্ঞাটির নিয়ন্ত্রণে থাকে যাতে এটি এপ্রোটোকলের উপর নির্ভর করতে পারে। যে পরিস্থিতিতে কেউ এসি ক্লাসে কার্যকারিতা ওভাররাইড করতে চায় সেখানে সাধারণত এটি হয় না (যেমন, এস্লাস সম্ভবত অ্যাপল দ্বারা সরবরাহিত একটি স্ট্যান্ডার্ড লাইব্রেরি ক্লাস হবে)।
জোনাথন লিওনার্ড

দ্রষ্টব্য, আপনি শ্রেণীর মূল সংজ্ঞাটি সংশোধন করতে বা না করতে চাইলে আপনি (কিছু ক্ষেত্রে) কোনও এক্সটেনশন বা সাবক্লাসে প্রোটোকল প্রয়োগ করতে পারেন।
shim
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.