উদ্দেশ্য-সি একাধিক উত্তরাধিকার


88

আমার 2 টি ক্লাস রয়েছে যার মধ্যে মেথডিএ এবং অন্যটিতে মেথবি রয়েছে। সুতরাং একটি নতুন ক্লাসে আমাকে পদ্ধতি মেথডএ এবং মেথড বিটি ওভাররাইড করতে হবে। সুতরাং আমি কীভাবে সি সি একাধিক উত্তরাধিকার অর্জন করব? আমি সিনট্যাক্স নিয়ে কিছুটা বিভ্রান্ত হয়ে পড়েছি।

উত্তর:


136

উদ্দেশ্য-সি একাধিক উত্তরাধিকার সমর্থন করে না, এবং আপনার এটির দরকার নেই। রচনা ব্যবহার করুন:

@interface ClassA : NSObject {
}

-(void)methodA;

@end

@interface ClassB : NSObject {
}

-(void)methodB;

@end

@interface MyClass : NSObject {
  ClassA *a;
  ClassB *b;
}

-(id)initWithA:(ClassA *)anA b:(ClassB *)aB;

-(void)methodA;
-(void)methodB;

@end

এখন আপনাকে কেবল প্রাসঙ্গিক আইভারটিতে পদ্ধতিটি চালিয়ে যেতে হবে। এটি আরও কোড, তবে উদ্দেশ্য-সি তে ভাষার বৈশিষ্ট্য হিসাবে একাধিক উত্তরাধিকার নেই।


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

4
আমি এটা বুঝতে পারি না। আপনার কি ইনস্ট্যান্টিয়েট করার দরকার নেই ClassAএবং ClassB? কলিং করে methodA:উপর MyClassএকরকম স্বয়ংক্রিয়ভাবে কল methodA:উপর ClassA?
জাকদানস

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


4
d11wtq, দুর্দান্ত উত্তর! সংযোজন হিসাবে, বার্তা ফরোয়ার্ডিং আপনাকে পুনরায় বাস্তবায়ন করার পদ্ধতি এবং পদ্ধতি বিয়ের পদক্ষেপ এড়াতে দেয়। বার্তাগুলি স্বয়ংক্রিয়ভাবে সামান্য কাজ করে উপযুক্ত অবজেক্টগুলিতে ফরোয়ার্ড করা যেতে পারে। developer.apple.com/library/mac/documentation/Cocoa/Conceptual/...
arsenius

3

মূলত আমি প্রোটোকল এবং বিভাগের সংমিশ্রণটি "পিতামাতা" হিসাবে কোড করি সিঙ্গলটনপ্যাটরনকে।

আমি যুক্ত করতে পারি না শুধুমাত্র একটি নতুন "ivar" তবে, আমি এটি যুক্ত বস্তুর সাহায্যে ঠেলাতে পারি।

#import <Foundation/Foundation.h>
@protocol BGSuperSingleton
+(id) singleton1;
+(instancetype)singleton;
@end

@interface NSObject (singleton) <BGSuperSingleton>

@end

static NSMutableDictionary * allTheSingletons;

+(instancetype)singleton
{
    return [self singleton1];
}
+(id) singleton1
{
    NSString* className = NSStringFromClass([self class]);

    if (!allTheSingletons)
    {
        allTheSingletons = NSMutableDictionary.dictionary;
    }

    id result = allTheSingletons[className];

    //PO(result);
    if (result==nil)
    {
        result = [[[self class] alloc]init];
        allTheSingletons[className]=result;
        [result additionalInitialization];
    }
    return result;
}

-(void) additionalInitialization
{

}

যখনই আমি কোনও শ্রেণি চাই এই বিজিএস্পারসিংলেটনকে "উত্তরাধিকারী" করি আমি কেবল এটিই করি:

#import "NSObject+singleton.h"

এবং যোগ করুন @interface MyNewClass () <BGSuperSingleton>


4
বিভাগগুলি একাধিক উত্তরাধিকার নয়। তারা ইতিমধ্যে বিদ্যমান শ্রেণিতে পদ্ধতি / ফাংশনগুলিকে টেক্কা দেওয়ার একটি উপায়। একাধিক উত্তরাধিকার তৃতীয় শ্রেণিকে এক বা একাধিক ক্লাসের (ভেরিয়েবল সহ) সংমিশ্রণ করার অনুমতি দেয়। আমি বিভাগগুলি পছন্দ করি। বিভাগগুলি খুব দরকারী। তবে এগুলি একাধিক উত্তরাধিকার নয়।
লয়েড সারজেন্ট

তবে ইউআইভিউউকন্ট্রোলারের একটি সাবক্লাস "সমর্থন" করতে পারে, এক্ষেত্রে সিঙ্গলটন প্যাটার্নটি আমার ইচ্ছা করা উচিত।
সেপ্টিয়াডি আগুস

প্রযুক্তিগতভাবে সমস্ত NSManagedObject "এখন কল করতে পারে" [objজ সিঙ্গলটন]। প্রোটোকলের সমর্থন নিয়ে আমি যাদের ইচ্ছামত সেট করেছি। যাইহোক একাধিক উত্তরাধিকার হিসাবে ভাল। এটি কেবলমাত্র যদি আমি শিশু শ্রেণীর কাছে পিতামাতার ইন্টারফেস এবং বাস্তবায়ন উভয়কে সমর্থন করতে চাই। যদি কেবল বাস্তবায়ন হয় তবে স্পষ্টতই রচনাটি হ'ল উপায়।
সেপ্টিয়াডি আগুস

<BGSuperSingleton> এর মতো প্রোটোকল যুক্ত করা ক্লাসগুলি তৈরি করে না তবে "সিঙ্গলটন" পদ্ধতিতে কল করতে সক্ষম হবে। আপনার এখনও এটি বাস্তবায়ন করতে হবে ...
কমাটোস্টে

-4

আপনি কি প্রোটোকল সম্পর্কে জানেন, প্রোটোকল হ'ল একাধিক উত্তরাধিকার প্রয়োগের উপায়


12
+1 "শ্রেণীবদ্ধের সাথে সম্পর্কিত নয় এমন শ্রেণীর মধ্যে মিল খুঁজে পেতে capture" বিকাশকারী.অ্যাপল.
com

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

আপনি কোনও বিভাগ বা রচনা দিয়ে প্রোটোকল একত্রিত করতে পারেন।
সেপ্টিয়াডি আগুস

-1 কারণ একাধিক উত্তরাধিকারের জন্য প্রোটোকলগুলি মোটেই নেই। একইভাবে JAVA, Interfacesএকাধিক উত্তরাধিকার প্রদান বা নকল করা হয় না।
থিমসিমারগাইন

4
অ্যাপল এর নিজস্ব ডকুমেন্টেশন থেকে @ ফ্রিএএসআইনবিয়ার একটি প্রোটোকল একটি প্রোগ্রাম্যাটিক ইন্টারফেস ঘোষণা করে যা কোনও শ্রেণি প্রয়োগ করতে বেছে নিতে পারে। প্রোটোকলগুলি উত্তরাধিকার দ্বারা দূরেরভাবে সম্পর্কিত দুটি শ্রেণীর পক্ষে একটি নির্দিষ্ট লক্ষ্য অর্জনের জন্য একে অপরের সাথে যোগাযোগ করা সম্ভব করে তোলে। তারা এইভাবে সাবক্লাসিংয়ের বিকল্প সরবরাহ করে । আপনি দেখতে পাচ্ছেন অ্যাপল সুস্পষ্টভাবে সাবক্লাসিং অর্থাৎ উত্তরাধিকার হিসাবে ব্যবহার করছে। সম্ভবত নিকেশ তার নিজের উত্তরে এই যুক্তিটি পরিষ্কার করতে সহায়ক হবে
মধু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.