অনপজ, অনস্টপ এবং অনডস্ট্রয় পদ্ধতিতে সুপারক্লাস পদ্ধতিগুলি কল করার সঠিক ক্রম কী? এবং কেন?


92

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

যদিও এটি অর্ধচক্রটিতে সৃষ্টির অর্থবোধ করে: অনক্রিট, অন স্টার্ট এবং অন রেসুমে, আমি ধ্বংসের অর্ধচক্রের সঠিক পদ্ধতিটি কী তা সম্পর্কে কিছুটা বিভ্রান্ত হয়েছি: অনপস, অনস্টপ, অনডাস্ট্রয়।

উদাহরণস্বরূপ নির্দিষ্ট উত্সগুলি প্রথমে ধ্বংস করে, সুপারক্লাস সংস্থানগুলি ধ্বংস করার আগে উদাহরণটি নির্দিষ্ট উত্সগুলি নির্ভর করে, অন্য উপায়ে নয়, তবে মন্তব্যগুলি অন্যথায় পরামর্শ দেয়। আমি কী মিস করছি?

সম্পাদনা : যেহেতু লোকেরা প্রশ্নটির উদ্দেশ্য হিসাবে বিভ্রান্ত হয়ে পড়েছে বলে মনে হচ্ছে, আমি কী জানতে চাই নীচের কোনটি সঠিক? এবং কেন ?

1. গুগল পরামর্শ দেয়

    @Override
    protected void onStop() {
      super.onStop();  // Always call the superclass method first

      //my implementation here
    }

2. অন্যভাবে

    @Override
    protected void onStop() {
       //my implementation here

       super.onStop();  
    }

4
শাটডাউন পদ্ধতির জন্য আমি ক্যাম্প দুটিতে আছি। আমি শুরুর পদ্ধতিতে ক্যাম্পে আছি।
danny117

4
এটি বেশ পয়েন্ট। শাটডাউন পদ্ধতির 1 পদ্ধতিটি কীভাবে বোধগম্য হয়েছিল তা কেবল বুঝতে পারি নি।
অনুদীপ বুলা

উত্তর:


109

উদাহরণস্বরূপ নির্দিষ্ট উত্সগুলি প্রথমে ধ্বংস করা, সুপারক্লাস সংস্থানগুলি ধ্বংস করার আগে উদাহরণ সুনির্দিষ্ট সংস্থাগুলি নির্ভর করতে পারে অন্য উপায়ে নয় not তবে মন্তব্যগুলি অন্যথায় পরামর্শ দেয়। আমি কী মিস করছি?

আমার মতে: একক জিনিস নয়।

মার্কের এই উত্তর (এসও তে ওরকম কমন্সওয়্যার) এই বিষয়ে আলোকপাত করেছে: লিঙ্ক - সুপারক্লাস পদ্ধতিতে কলটি প্রথম বিবৃতি হওয়া উচিত? । তবে তারপরে আপনি নীচের মন্তব্যটি তার উত্তরে দেখতে পাচ্ছেন:

তবে অফিসিয়াল ডক কেন বলেছেন: অনপজ () এ "সর্বদা প্রথমে সুপার ক্লাস পদ্ধতিটি কল করুন"?

এক বর্গ ফিরে। ঠিক আছে, এর অন্য একটি কোণ থেকে দেখুন। আমরা জানি যে জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন কোনও অর্ডার নির্দিষ্ট করে না যেখানে কলটি super.overridenMethod()অবশ্যই স্থাপন করা উচিত (বা যদি কলটি অবশ্যই অবশ্যই রাখা উচিত)।

শ্রেণীর ক্রিয়াকলাপের ক্ষেত্রে, super.overridenMethod()কলগুলি প্রয়োজনীয় এবং প্রয়োগ করা হয় :

if (!mCalled) {
    throw new SuperNotCalledException(
        "Activity " + mComponent.toShortString() +
            " did not call through to super.onStop()");
}

mCalledসত্য হিসাবে সেট করা হয় Activity.onStop()

এখন, বিতর্ক করার একমাত্র বিশদটি কেবল অর্ডার।

I also know that both work

অবশ্যই অ্যাক্টিভিটি.অনপজ () এর জন্য পদ্ধতিটির প্রধান অংশটি দেখুন:

protected void onPause() {
    if (DEBUG_LIFECYCLE) Slog.v(TAG, "onPause " + this);

    // This is to invoke 
    // Application.ActivityLifecyleCallbacks.onActivityPaused(Activity)
    getApplication().dispatchActivityPaused(this);

    // The flag to enforce calling of this method
    mCalled = true;
}

আপনি যেদিকেই কল স্যান্ডউইচ করুন super.onPause(), আপনি ঠিক আছেন be ক্রিয়াকলাপ.অনস্টপ () এর একই পদ্ধতির বডি রয়েছে। তবে Activity.onDestroy () এ একবার দেখুন:

protected void onDestroy() {
    if (DEBUG_LIFECYCLE) Slog.v(TAG, "onDestroy " + this);
    mCalled = true;

    // dismiss any dialogs we are managing.
    if (mManagedDialogs != null) {
        final int numDialogs = mManagedDialogs.size();
        for (int i = 0; i < numDialogs; i++) {
            final ManagedDialog md = mManagedDialogs.valueAt(i);
            if (md.mDialog.isShowing()) {
                md.mDialog.dismiss();
            }
        }
        mManagedDialogs = null;
    }

    // close any cursors we are managing.
    synchronized (mManagedCursors) {
        int numCursors = mManagedCursors.size();
        for (int i = 0; i < numCursors; i++) {
            ManagedCursor c = mManagedCursors.get(i);
            if (c != null) {
                c.mCursor.close();
            }
        }
        mManagedCursors.clear();
    }

    // Close any open search dialog
    if (mSearchManager != null) {
        mSearchManager.stopSearch();
    }

    getApplication().dispatchActivityDestroyed(this);
}

এখানে, ক্রিয়াকলাপটি কীভাবে আপনার ক্রিয়াকলাপটি সেটআপ হয় এবং কলিং তার পরে নিম্নলিখিত কোডটির সাথে হস্তক্ষেপ করবে কিনা তার উপর নির্ভর করে সম্ভবতsuper.onDestroy() অর্ডারটি গুরুত্বপূর্ণ।

চূড়ান্ত শব্দ হিসাবে, বিবৃতিটির Always call the superclass method firstব্যাক আপ করার পক্ষে খুব বেশি প্রমাণ রয়েছে বলে মনে হয় না। সবচেয়ে খারাপটি (বিবৃতিটির জন্য) হ'ল নিম্নলিখিত কোডটি নেওয়া হয়েছে android.app.ListActivity:

public class ListActivity extends Activity {

    ....

    @Override
    protected void onDestroy() {
        mHandler.removeCallbacks(mRequestFocus);
        super.onDestroy();
    }
    ....    
}

এবং, লুনারল্যান্ডার নমুনা অ্যাপ্লিকেশন থেকে অ্যান্ড্রয়েড এসডিতে অন্তর্ভুক্ত:

public class LunarLander extends Activity {

    ....

    @Override
    protected void onPause() {
        mLunarView.getThread().pause(); // pause game when Activity pauses
        super.onPause();
    }
    ....
}

সংক্ষিপ্তসার এবং যোগ্য উল্লেখ:

ব্যবহারকারী ফিলিপ শিয়ার্ড : এমন একটি পরিস্থিতি সরবরাহ করে যেখানে super.onPause()কোনও ক্রিয়াকলাপ ব্যবহার শুরু হওয়ার ক্ষেত্রে কলটি বিলম্বিত হতে হবে startActivityForResult(Intent)setResult(...) পরে ব্যবহার করে ফলাফল নির্ধারণ করা কার্যকরsuper.onPause() হবে না। পরে তিনি তার উত্তরের মন্তব্যে এ বিষয়ে স্পষ্ট করে দেন।

ব্যবহারকারী শরিফ এলখতিব : সুপারক্লাসটি কেন প্রথমে তার সংস্থানগুলি শুরু করতে এবং তার উত্সগুলি ধ্বংস করার কারণটি যুক্তি থেকে সর্বশেষে অনুসরণ করে তা ব্যাখ্যা করে:

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

তিনি উল্লেখ করতে এগিয়ে যান: যদি কোনও শিশু শ্রেণি পিতামাতা শ্রেণি থেকে যথাযথভাবে বিচ্ছিন্ন করা হয় (সংস্থার নির্ভরতার শর্তে), super.X()কলগুলি কোনও আদেশের নির্দিষ্টকরণের সাথে মেনে চলার প্রয়োজন নেই।

একটি super.onDestroy()কল প্লেসমেন্ট প্রোগ্রামের যুক্তিকে প্রভাবিত করে এমন একটি দৃশ্যের মধ্য দিয়ে পড়তে এই পৃষ্ঠায় তার উত্তর দেখুন ।

মার্ক একটি উত্তর থেকে :

যে উপাদানগুলি আপনাকে ওভাররাইড করে যা উপাদান তৈরির অংশ (onCreate (), onStart (), onResume (), ইত্যাদি), আপনার নিজের আগে অ্যান্ড্রয়েডের কাজ করার সুযোগ রয়েছে কিনা তা নিশ্চিত করার জন্য আপনার প্রথম বিবৃতি হিসাবে সুপারক্লাসে চেইন করা উচিত এমন কিছু করার চেষ্টা করুন যা সেই কাজটি করার উপর নির্ভর করে।

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

অকার্যকর (.CreateOptionsMenu () ইত্যাদি) ব্যতীত অন্য কিছু ফেরত দেওয়ার পদ্ধতিগুলি কখনও কখনও আপনি রিটার্ন স্টেটমেন্টে সুপারক্লাসে চেইন করেন, ধরে নেওয়া হয় যে আপনি নির্দিষ্টভাবে কোনও নির্দিষ্ট ফেরতের মান জোর করতে বাধ্য এমন কিছু করছেন না।

অন্যান্য সমস্ত কাজ যেমন --অ্যাক্টিভিটিস রেজাল্ট () - সম্পূর্ণরূপে আপনার উপর নির্ভর করে। আমি প্রথম জিনিস হিসাবে সুপারক্লাসে শৃঙ্খলা প্রবণতা করি, তবে আপনি যদি সমস্যার মধ্যে পড়ে না থাকেন তবে পরে শৃঙ্খলা ঠিক করা উচিত।

এই থ্রেড থেকে বব কার্নস :

এটি একটি ভাল প্যাটার্ন [[(মার্ক উপরে উপরে বর্ণিত প্যাটার্ন))] তবে আমি কিছু ব্যতিক্রম পেয়েছি। উদাহরণস্বরূপ, আমি যে থিমটি আমার প্রেফারেন্সঅ্যাক্টিভিটিতে প্রয়োগ করতে চেয়েছিলাম তা কার্যকর হবে না যদি না আমি এটিকে সুপারক্লাসের অনক্রিট () এর আগে রাখি।

ব্যবহারকারী স্টিভ বেনেটও এদিকে দৃষ্টি আকর্ষণ করেছেন:

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

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

ব্যবহারকারী LOG_TAG : সুপারক্লাস নির্মাণকারীর কাছে কেন কল করা উচিত সবকিছুর আগে হওয়া দরকার তা ব্যাখ্যা করে । আমার মতে, এই ব্যাখ্যাটি জিজ্ঞাসা করা প্রশ্নের সাথে যোগ করে না।

শেষ দ্রষ্টব্য : বিশ্বাস করুন, তবে যাচাই করুন। বিবৃতিটির Always call the superclass method firstযৌক্তিক সমর্থন রয়েছে কিনা তা দেখার জন্য এই পৃষ্ঠার বেশিরভাগ উত্তরই এই পদ্ধতির অনুসরণ করে । এটি দেখা যাচ্ছে যে এটি হয় না; কমপক্ষে, ক্লাস ক্রিয়াকলাপের ক্ষেত্রে নয়। সাধারণত, সুপারের পদ্ধতিতে কলগুলি অর্ডার করা প্রয়োজনীয় কিনা তা নির্ধারণ করতে সুপারক্লাসের উত্স কোডের মাধ্যমে একটিটি পড়া উচিত।


4
কি দারুন. পয়েন্টার জন্য ধন্যবাদ। এটি এবং @ শেরিফের উত্তর উভয়ই গুরুত্বপূর্ণ প্রসঙ্গ সরবরাহ করে। আপনারা কেউ যদি এই পৃষ্ঠায় উত্তরগুলি সংক্ষিপ্ত করতে পারেন, আমি এটি স্বীকৃত হিসাবে চিহ্নিত করব। দয়া করে অন্তর্ভুক্ত করুন: 1. এই পৃষ্ঠায় উত্তরগুলি। 2. @ এ এই পৃষ্ঠাটিতে 3. @ CommonsWare এর উত্তরে ফিলিপের উত্তর এই পৃষ্ঠার 4. এই আলোচনা আমি করব, কিন্তু আমি আপনার বিস্ময়কর উত্তরের জন্য ক্রেডিট চাই না। চিয়ার্স এবং ধন্যবাদ
অনুদীপ বুলা

ওহে. আপনি কি দয়া করে সংক্ষিপ্তসারটি দেখবেন, @ শরীফ চান না বলে?
অনুদীপ বুল্লা

@ অনুদীপবুল্লা হাই অনুদীপ, আগামীকাল পর্যন্ত আমাকে দিন। আমি আমার উত্তরে প্রাসঙ্গিক উপাদান যুক্ত করব এবং আপনাকে এখানে একটি মন্তব্য করব।
বিক্রম

@ অনুদীপবুলা আমি উপরে একটি সংক্ষিপ্তসার যুক্ত করেছি। আমি যদি কিছু মিস করি তবে দয়া করে আমাকে জানান।
বিক্রম

@ বিক্রম ইজ টিএল; ডিআর। কলিং onDestroyএবং onStopশেষটি একটি নিরাপদ ডিফল্ট এবং onPauseজিনিসগুলির জন্য কিছু ক্ষেত্রে কৌশলযুক্ত হতে পারে? আপনি কি প্রথম যোগ করতে পারেন? আমি উত্তরটি নিজে সম্পাদনা করার জন্য প্রলুব্ধ হয়েছিলাম তবে আমি নিশ্চিত নই যে এই সংক্ষিপ্তসারটি সঠিক কিনা।
ব্লেজারব্লেড

13

যেহেতু (আপনি বলেছেন) প্রথমে সুপার অনক্রিটকে কল করা বুদ্ধিমান: এটি সম্পর্কে চিন্তা করুন।

আমি যখন তৈরি করতে চাই তখন আমার সুপার তার সংস্থানগুলি তৈরি করে> আমি আমার সংস্থানগুলি তৈরি করি।

বিপরীতভাবে: (একটি স্ট্যাকের সাজানো)

আমি যখন ধ্বংস করতে চাই, আমি আমার সংস্থানগুলি নষ্ট করি> আমার সুপার তার সংস্থানগুলি ধ্বংস করে।


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

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

উপরেরটি যদি বোঝায়, তবে যে কোনও মুহুর্তে আমাদের এমন একটি ক্রিয়াকলাপ রয়েছে যা উপরের ধারণার সাথে মেনে চলেন consider যদি আমি এই ক্রিয়াকলাপটি প্রসারিত করতে চাই তবে আমি সম্ভবত একইভাবে অনুভব করব এবং একই সঠিক যুক্তির কারণে একই ক্রমটি অনুসরণ করব।

প্রবেশন দ্বারা, যে কোনও ক্রিয়াকলাপ একই জিনিস করা উচিত। এই নিয়মগুলি অনুসরণ করতে বাধ্য করা একটি ক্রিয়াকলাপের জন্য এখানে একটি ভাল বিমূর্ত শ্রেণি রয়েছে:

package mobi.sherif.base;

import android.app.Activity;
import android.os.Bundle;

public abstract class BaseActivity extends Activity {
    protected abstract void doCreate(Bundle savedInstanceState);
    protected abstract void doDestroy();
    protected abstract void doResume();
    protected abstract void doPause();
    protected abstract void doStart();
    protected abstract void doStop();
    protected abstract void doSaveInstanceState(Bundle outState);
    @Override
    protected final void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        doCreate(savedInstanceState);
    }
    @Override
    protected final void onDestroy() {
        doDestroy();
        super.onDestroy();
    }
    @Override
    protected final void onResume() {
        super.onResume();
        doResume();
    }
    @Override
    protected final void onPause() {
        doPause();
        super.onPause();
    }
    @Override
    protected final void onStop() {
        doStop();
        super.onStop();
    }
    @Override
    protected final void onStart() {
        super.onStart();
        doStart();
    }
    @Override
    protected final void onSaveInstanceState(Bundle outState) {
        doSaveInstanceState(outState);
        super.onSaveInstanceState(outState);
    }
}

অবশেষে, যদি আপনার কার্যকলাপটি AnudeepBullaActivityবেসঅ্যাক্টিভিটি এবং তার পরে প্রসারিত হয় তবে আমি কী এটি তৈরি SherifElKhatibActivityকরতে চাই যা আপনার কার্যকলাপকে প্রসারিত করে? কোন ক্রমে আমাকে super.doফাংশনগুলি কল করা উচিত ? এটি শেষ পর্যন্ত একই জিনিস।


আপনার প্রশ্নের হিসাবে:

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

আমি কিছুটা চেষ্টা করেছিলাম এবং এটি সম্ভবত সহজ নয় (যেহেতু এটি গুগল তাই আমরা ভুল প্রমাণ করার চেষ্টা করছি) কখন এমন একটি কার্যকলাপ তৈরি করা যায় যা কখন সুপার বলা হয়।

কেন?

এই ফাংশনগুলিতে যে কোনও কিছু করা ক্রিয়াকলাপ শ্রেণীর কাছে ব্যক্তিগত এবং এটি আপনার সাবক্লাসের সাথে কোনও বিরোধের কারণ হতে পারে না। উদাহরণস্বরূপ (onDestroy)

protected void onDestroy() {
    if (DEBUG_LIFECYCLE) Slog.v(TAG, "onDestroy " + this);
    mCalled = true;

    // dismiss any dialogs we are managing.
    if (mManagedDialogs != null) {
        final int numDialogs = mManagedDialogs.size();
        for (int i = 0; i < numDialogs; i++) {
            final ManagedDialog md = mManagedDialogs.valueAt(i);
            if (md.mDialog.isShowing()) {
                md.mDialog.dismiss();
            }
        }
        mManagedDialogs = null;
    }

    // close any cursors we are managing.
    synchronized (mManagedCursors) {
        int numCursors = mManagedCursors.size();
        for (int i = 0; i < numCursors; i++) {
            ManagedCursor c = mManagedCursors.get(i);
            if (c != null) {
                c.mCursor.close();
            }
        }
        mManagedCursors.clear();
    }

    // Close any open search dialog
    if (mSearchManager != null) {
        mSearchManager.stopSearch();
    }

    getApplication().dispatchActivityDestroyed(this);
}

mManagedCursors এবং mManagedDialogs এবং mSearchManager সমস্ত ব্যক্তিগত ক্ষেত্র। এবং এখানে সর্বজনীন / সুরক্ষিত এপিআই এর দ্বারা প্রভাবিত হবে না।

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

বর্তমানে চলমান ক্রিয়াকলাপগুলির সংখ্যা গণনা করে এমন একটি অ্যাপ্লিকেশন ক্লাস তৈরি করুন:

package mobi.shush;

import android.app.Activity;
import android.app.Application;
import android.app.Application.ActivityLifecycleCallbacks;
import android.os.Bundle;

public class SherifApplication extends Application implements ActivityLifecycleCallbacks {
    @Override
    public void onCreate() {
        super.onCreate();
        registerActivityLifecycleCallbacks(this);
    }
    public int getCount() {
        return count;
    }
    int count = 0;
    @Override
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
        count++;
    }
    @Override
    public void onActivityDestroyed(Activity activity) {
        count--;
    }
    @Override
    public void onActivityPaused(Activity activity) {}
    @Override
    public void onActivityResumed(Activity activity) {}
    @Override
    public void onActivitySaveInstanceState(Activity activity, Bundle outState)           {}
    @Override
    public void onActivityStarted(Activity activity) {}
    @Override
    public void onActivityStopped(Activity activity) {}
}

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

@Override
protected void onDestroy() {
    super.onDestroy();
    if(((SherifApplication) getApplication()).getCount() == 0) {
        //i want to go to a certain activity when there are no other activities
        startActivity(new Intent(this, GoodBye.class));
    }
}

আপনি যদি আপনার অনডেট্রয়ের শুরুতে সুপার.অনডেস্ট্রয়কে কল করেন তবে গুডবাই ক্রিয়াকলাপটি চালু করা হবে। আপনি যদি আপনার অনডেট্রয়ের শেষে সুপার.অনডেস্ট্রয় কল করেন তবে গুডবাই ক্রিয়াকলাপটি আরম্ভ হবে না।

অবশ্যই, আবার এটি সর্বোত্তম উদাহরণ নয়। তবে এটি দেখায় যে গুগল এখানে কিছুটা গণ্ডগোল করেছে। অন্য কোনও ভেরিয়েবল আপনার অ্যাপ্লিকেশনটির আচরণকে প্রভাবিত করবে না। তবে এই প্রেরণটিকে onDestroy এ যুক্ত করার ফলে সুপারটি আপনার সাবক্লাসে কোনওভাবে হস্তক্ষেপ করে।

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

উদাহরণস্বরূপ, performStopফাংশনটিকে ফাংশন বলা হয় যা ঘুরে অনসটপ ফাংশনটি কল করে:

final void performStop() {
    if (mLoadersStarted) {
        mLoadersStarted = false;
        if (mLoaderManager != null) {
            if (!mChangingConfigurations) {
                mLoaderManager.doStop();
            } else {
                mLoaderManager.doRetain();
            }
        }
    }

    if (!mStopped) {
        if (mWindow != null) {
            mWindow.closeAllPanels();
        }

        if (mToken != null && mParent == null) {
            WindowManagerGlobal.getInstance().setStoppedState(mToken, true);
        }

        mFragments.dispatchStop();

        mCalled = false;
        mInstrumentation.callActivityOnStop(this);
        if (!mCalled) {
            throw new SuperNotCalledException(
                    "Activity " + mComponent.toShortString() +
                    " did not call through to super.onStop()");
        }

        synchronized (mManagedCursors) {
            final int N = mManagedCursors.size();
            for (int i=0; i<N; i++) {
                ManagedCursor mc = mManagedCursors.get(i);
                if (!mc.mReleased) {
                    mc.mCursor.deactivate();
                    mc.mReleased = true;
                }
            }
        }

        mStopped = true;
    }
    mResumed = false;
}

লক্ষ্য করুন যে তারা এই ক্রিয়াকলাপের কোথাও ক্রিয়াকলাপের অনস্টপকে কল করে। সুতরাং, তারা অন্টসটপে কল করার আগে বা তার পরে সমস্ত কোড (সুপার.অনসটপ অন্তর্ভুক্ত) রেখে এবং তারপরে খালি অনসটপ সুপার ফাংশনগুলি ব্যবহার করে এবং এমনকি সুপারনটক্ল্যাড এক্সেকশন যোগ না করে বা এই কলটির জন্য পরীক্ষা না করেই সাবস্ক্লাসগুলি অবহিত করতে পারে।

এর জন্য, তারা যদি এই প্রেরণটিকে সুপার.অনডস্ট্রয়ের শেষের দিকে কল না করে পারফর্মডেস্ট্রয়ে অ্যাক্টিভিটি লাইফসাইকেলের কাছে কল করে, আমাদের কার্যকলাপের আচরণটি আমরা সুপারকে কখন ডাকতাম তা নির্বিশেষে একই রকম হতে পারত।

যাইহোক এটিই তারা প্রথম কাজ করে (কিছুটা ভুল) এবং এটি কেবল এপিআই 14 এ রয়েছে।


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

ওহ, আমি গুগলের পরামর্শগুলি এবং অন্যান্য উপায়টি দেখিনি: পি! শোনো, আমি এমন একটি ক্রিয়াকলাপ তৈরি করার চেষ্টা করছি যা আপনি প্রথমে ডাস্ট্রয়কে কল করলে ক্রাশ হবে। আপনারও সেই চেষ্টা করা উচিত। চিয়ার্স
শেরিফ এলখতিব

@ অনুদীপবুল্লা আপনি আমার সম্পাদনাগুলি পরীক্ষা করতে পারেন। এবং বিটিডব্লিউ আপনি চেষ্টা বন্ধ করতে পারেন। super.onসম্ভবত আপনার ক্রিয়াকলাপ কখনই ক্রাশ হবে না।
শেরিফ এলখতিব

কি দারুন. পয়েন্টার জন্য ধন্যবাদ। এটি এবং @ ব্যবহারকারীর উত্তর উভয়ই গুরুত্বপূর্ণ প্রসঙ্গ সরবরাহ করে। আপনারা কেউ যদি এই পৃষ্ঠায় উত্তরগুলি সংক্ষিপ্ত করতে পারেন, আমি এটি স্বীকৃত হিসাবে চিহ্নিত করব। দয়া করে অন্তর্ভুক্ত করুন: এই পৃষ্ঠায় 1. উত্তরসমূহ। 2. @ এ এই পৃষ্ঠাটিতে 3. @ CommonsWare এর উত্তরে ফিলিপের উত্তর এই পৃষ্ঠার 4. এই আলোচনা আমি করব, কিন্তু আমি আপনার বিস্ময়কর উত্তরের জন্য ক্রেডিট চাই না। চিয়ার্স এবং ধন্যবাদ
অনুদীপ বুলা

@ অনুদীপবুল্লা আপনাকে স্বাগতম আমি নিশ্চিত না যে আমরা কীভাবে চূড়ান্ত লিখন আপ পোস্ট করব তা স্থির করব।
বিক্রম

2

আপনি বলছেন যে গুগল পদ্ধতি 1 টি প্রস্তাব করে, তবে ডায়ান হ্যাকবর্ন, একজন প্রখ্যাত অ্যান্ড্রয়েড ফ্রেমওয়ার্ক ইঞ্জিনিয়ার পরামর্শ দেয় অন্যথায় গুগল ফোরামের লিঙ্কটি দেখুন

এটা অতি বর্গ ডাকতে স্বজ্ঞাত জ্ঞান করে তোলে গত যখন অন্তক মধ্যে একটি দৃষ্টান্ত onPause, onStop এবং onDestroy পদ্ধতি ও প্রথম যখন তৈরি পদ্ধতি সঙ্গে একটি দৃষ্টান্ত onCreate, onResume এবং onStart


ডায়ান হ্যাকোবারের পোস্টের লিঙ্কটি গুরুত্বপূর্ণ এবং প্যাটার্নটি নিশ্চিত করে।
নিক ওয়েস্টগেট

1

জাভা দৃষ্টিকোণ থেকে এখানে এই বিভ্রান্তির কিছু সমাধান রয়েছে:

কেন এটি () এবং সুপার () কোনও নির্মাণকারীর প্রথম বিবৃতি হতে হবে?

প্যারেন্ট ক্লাস 'কনস্ট্রাক্টরকে সাবক্লাস' কনস্ট্রাক্টরের আগে ডাকতে হবে। এটি নিশ্চিত করবে যে আপনি যদি আপনার নির্মাতার পিতামাতা শ্রেণিতে কোনও পদ্ধতি কল করেন তবে পিতামাতা বর্গটি ইতিমধ্যে সঠিকভাবে সেট আপ করা হয়েছে।

আপনি যা করতে চেষ্টা করছেন, সুপার কন্সট্রাক্টরকে অর্গগুলি পাস করা পুরোপুরি আইনানুগ, আপনার যেমন করানো হচ্ছে ঠিক তেমন লাইনগুলি ইনলাইনগুলি তৈরি করতে হবে, বা সেগুলি আপনার কনস্ট্রাক্টরের কাছে প্রেরণ করতে হবে এবং তারপরে এগুলিকে সুপার এ পাস করতে হবে:

public MySubClassB extends MyClass {
        public MySubClassB(Object[] myArray) {
                super(myArray);
        }
}

সংকলক যদি এটি প্রয়োগ না করে তবে আপনি এটি করতে পারেন:

public MySubClassB extends MyClass {
        public MySubClassB(Object[] myArray) {
                someMethodOnSuper(); //ERROR super not yet constructed
                super(myArray);
        }
}

এটি দেখায় যে প্রকৃতপক্ষে সাবফিল্ডসকে সুপ্রিমাক্লাসের আগে ইনিলিয়ালাইজড করতে হবে! ইতিমধ্যে, জাভা প্রয়োজনীয়তা সুপার কনস্ট্রাক্টর যুক্তিটি কী তা বিশেষজ্ঞ করে ক্লাসকে বিশেষজ্ঞ করা থেকে আমাদের "প্রতিরক্ষা" করে

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

(1) সুপারটি প্রথম বিবরণ যাচাই করা সেই সমস্যাটি প্রতিরোধের জন্য পর্যাপ্ত নয়। উদাহরণস্বরূপ, আপনি "সুপার (someMethodInSuper ()) রাখতে পারেন; আপনার কনস্ট্রাক্টর মধ্যে এটি সুপারের প্রথম বিবৃতি হওয়া সত্ত্বেও সুপারক্লাসে কোনও পদ্ধতির নির্মাণের আগে এটি অ্যাক্সেস করার চেষ্টা করে।

(২) সংকলকটি একটি পৃথক চেক বাস্তবায়নের জন্য উপস্থিত হয় যা নিজে থেকেই এই সমস্যাটি প্রতিরোধের জন্য যথেষ্ট। বার্তাটি "সুপার টাইপ কনস্ট্রাক্টর ডেকে যাওয়ার আগে xxx উল্লেখ করতে পারে না" reference অতএব, সুপারটি প্রথম বিবৃতি যাচাই করা প্রয়োজন হয় না

দয়া করে এই http://valjok.blogspot.in/2012/09/super-constructor-must-be-first.html এর মাধ্যমে যান


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

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

1

মনে রাখা সবচেয়ে গুরুত্বপূর্ণ জিনিস হ'ল super.onPause()স্পষ্টভাবে কল setResult(Activity.RESULT_CANCELED)। তবে setResultকেবল একবার কল করা যেতে পারে এবং পরবর্তী সমস্ত কল উপেক্ষা করা হবে। সুতরাং আপনি যদি কোনও ধরণের ফলাফলকে পিতামাতার ক্রিয়াকলাপের দিকে ফিরে যেতে চান তবে ফোন করার আগে আপনাকে setResultনিজেকে কল করতে হবে । এটাই সবচেয়ে বড় গোচা, যতদূর আমি জানি।super.onPause()


বাহ, এটা গুরুত্বপূর্ণ মনে হচ্ছে। সুতরাং একটি পরিস্থিতি রয়েছে, যখন আপনাকে অবশ্যই সুপার পদ্ধতিগুলিতে কলটি বিলম্ব করতে হবে। ধন্যবাদ.
অনুদীপ বুল্লা

super.onPause() implicitly calls setResult(Activity.RESULT_CANCELED)। আপনি বলতে পারেন আপনি এটি কোথা থেকে পেয়েছেন?
বিক্রম

আমি বিভ্রান্ত ছিলাম. এটি আসলে সমাপ্তি () যা সেটরসাল্টকে কল করে এবং সুপার.অনব্যাকপ্রেসড () কল ফিনিস ()। সুতরাং setResult অবশ্যই সুপার.অনব্যাকপ্রেসড () এর আগে কল করতে হবে। আমি নিশ্চিত নই যে সুপার.অনপোজ () দ্বারা সেটরসাল্ট কল করার কারণ হতে পারে এমন কোনও পরিস্থিতি রয়েছে কিনা তবে আমি এটিকে ঝুঁকি না দেওয়া পছন্দ করি।
ফিলিপ শিয়ার্ড

1

উভয়ই সঠিক আইএমও are

ডক্স অনুসারে

উত্পন্ন ক্লাসগুলিকে এই পদ্ধতিটি সুপার ক্লাসের প্রয়োগের জন্য কল করতে হবে। যদি তারা তা না করে তবে একটি ব্যতিক্রম ছুঁড়ে দেওয়া হবে।

Super ডকুমেন্টেশন স্পষ্টভাবে তাই বললে পদ্ধতিটি সর্বদা কল করা উচিত।

সুপার পদ্ধতিটি কখন কল করতে হবে তা আপনি বেছে নিতে পারেন।

সূত্রের দিকে তাকিয়ে onPause

protected void onPause() {
    getApplication().dispatchActivityPaused(this);
    mCalled = true;
}

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

তবে সেরা অনুশীলনের জন্য আপনার প্রথমে এটি কল করা উচিত।

আমি এটি বেশিরভাগই সুরক্ষা ব্যবস্থা হিসাবে সুপারিশ করি: যদি কোনও ব্যতিক্রম থাকে তবে superইতিমধ্যে উদাহরণ পদ্ধতিটি ডাকা হবে।

এছাড়াও এই কলগুলি প্রথম লাইনে স্থাপন করা আপনাকে ভবিষ্যতে ভুলগুলি এড়াতে সহায়তা করবে যেমন পদ্ধতিতে কোড মোছা এবং দুর্ঘটনাক্রমে কলটি সুপার ক্লাসে মুছে ফেলা।


আমি দুঃখিত যদি প্রশ্নটি প্রথমবারের মতো পুরোপুরি পরিষ্কার না হত তবে দয়া করে এখন এটি দেখুন।
অনুদীপ বুল্লা

@ অনুদীপবুলা এটিই আমি আপনাকে ব্যাখ্যা করেছি। আপনি এগুলির দুটি ব্যবহার করতে পারেন। উভয়ই বৈধ।
সুনীল মিশ্র

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

আপনি যদি ওভাররাইড না করেন তবে পদ্ধতিগুলি Base Classকল করা হয়েছে তবে আপনি যদি ওভাররাইড করে থাকেন তবে আপনার superঅন্যটি যা দরকার তা কল করা দরকারandroid.app.SuperNotCalledException
সুনীল মিশ্র

4
আপনি ভুল বোঝাবুঝি মনে হচ্ছে। ফোন করা বা না করা প্রশ্ন নয়। আপনি যেমনটি উল্লেখ করেছেন, আপনি যদি সেগুলি ওভাররাইড করেন তবে আপনার কাছে অবশ্যই এটি রয়েছে। প্রশ্ন হচ্ছে, কখন?
অনুদীপ বুল্লা

0

সিস্টেমের জন্য অভ্যন্তরীণভাবে ক্রিয়াকলাপটিকে সঠিক অবস্থায় রাখার জন্য কলব্যাকের সুপারের প্রয়োজন হয়।

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

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

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

তবে সিস্টেমটি যা করতে দেয় তা করতে সর্বোত্তমভাবে আপনার কোডটি অনুসরণ করে একটি কলব্যাকের প্রথম লাইনে সুপার লাগাতে পারে, যদি আপনার এটির সাথে ব্রেক করার কোনও উপযুক্ত কারণ না থাকে।


অনক্রিটে ক্রমটি বেশ বোঝা যাচ্ছে। ধ্বংস পদ্ধতিতে কী ঘটে? অন ​​স্টপ বলুন। মনে করুন আমার অনটপ বাস্তবায়ন যদি ডাকা হয় তবে সুপার পদ্ধতিটি প্রকাশিত কিছু সংস্থান ব্যবহার করে my তবে তা বাস্তবায়িত হওয়ার পরে সুপার পদ্ধতিটি কল করতে তার অর্থ হয়।
অনুদীপ বুল্লা

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

আপনি কোন সংস্থানটির কথা বলছেন, যা আপনি অনক্রিটে অ্যাক্সেস করতে পারবেন তবে অনড্রেস্ট্রয়ে নয়?
স্টিভ বেনেট

আমার কোন ব্যবহারের মামলা নেই। আমি কেবল ভাবছি, এটি ওওপি শৈলীর সাথে কীভাবে পরিবর্তিত হয়। আপনার প্রয়োগের আগে সুপার ক্লাসের কনস্ট্রাক্টরকে প্রথমে ডাকা হয় এবং সুপার ক্লাসের ডেস্ট্রাক্টরদের শেষ হিসাবে ডাকা হয়, আপনার প্রয়োগের পরে? অনপজ, অনস্টপ এবং অনডস্ট্রয় কঠোরভাবে ধ্বংসকারী নয়, তবে তারা একই জিনিসগুলি ঝোঁক করে, তাই না? অন্ততপক্ষেডস্ট্রয় এবং বেশিরভাগ অনস্টপেই খুব .. না?
অনুদীপ বুল্লা

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