কীভাবে উত্সযুক্ত শ্রেণিকে সুপার পদ্ধতিতে কল করতে বাধ্য করবেন? (Android এর মতো করে)


85

আমি ভাবছিলাম, যখন নতুন তৈরি Activityশ্রেণীর এবং তারপর অগ্রাহ্য onCreate()পদ্ধতি, অন্ধকার আমি সবসময় স্বয়ং যুক্ত হয়ে: super.onCreate()। এটা কিভাবে হয়? বিমূর্ত বা অভিভাবক শ্রেণিতে কোনও জাভা কীওয়ার্ড রয়েছে যা এটি বাধ্য করে?

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


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

@ রডরিগো কাস্ট্রো আপনি প্রতিটি পদ্ধতির জন্য জাভাদোকগুলি পর্যালোচনা করতে পারেন। উদাহরণস্বরূপ অনক্রিট ()

উত্তর:


10

এখানে এর উত্স Activity#onCreate()- এটি প্রায় সমস্ত মন্তব্য ( মূল - লাইন দেখুন ~ 800 ):

/**
 * Called when the activity is starting.  This is where most initialization
 * should go: calling {@link #setContentView(int)} to inflate the
 * activity's UI, using {@link #findViewById} to programmatically interact
 * with widgets in the UI, calling
 * {@link #managedQuery(android.net.Uri , String[], String, String[], String)} to retrieve
 * cursors for data being displayed, etc.
 *
 * <p>You can call {@link #finish} from within this function, in
 * which case onDestroy() will be immediately called without any of the rest
 * of the activity lifecycle ({@link #onStart}, {@link #onResume},
 * {@link #onPause}, etc) executing.
 *
 * <p><em>Derived classes must call through to the super class's
 * implementation of this method.  If they do not, an exception will be
 * thrown.</em></p>
 *
 * @param savedInstanceState If the activity is being re-initialized after
 *     previously being shut down then this Bundle contains the data it most
 *     recently supplied in {@link #onSaveInstanceState}.  <b><i>Note: Otherwise it is null.</i></b>
 *
 * @see #onStart
 * @see #onSaveInstanceState
 * @see #onRestoreInstanceState
 * @see #onPostCreate
 */
protected void onCreate(Bundle savedInstanceState) {
    mVisibleFromClient = !mWindow.getWindowStyle().getBoolean(
            com.android.internal.R.styleable.Window_windowNoDisplay, false);
    mCalled = true;
}

তাই হয়, আমার অনুমান করা হবে যে এডিটি অন্ধকার প্লাগইন কি যে কল স্বয়ংক্রিয় যোগ হয় super.onCreate()আপনার জন্য। এটি মোট অনুমান, যদিও।


4
আমার ধারণা, mCalled = trueএটিও সম্ভাব্য ব্যতিক্রমের জন্য ব্যবহৃত হয়েছে। না হতে পারে onCreate()তবে সত্যই যখন এই জাতীয় ব্যতিক্রম ছোঁড়া হয় তখন এটি সেই সাধারণ প্যাটার্নটি ব্যবহার করবে।
পিটারডকে

194

এটি সমর্থন টীকা গ্রন্থাগারে যুক্ত করা হয়েছে:

dependencies {
    compile 'com.android.support:support-annotations:22.2.0'
}

http://tools.android.com/tech-docs/support-annotations

@ কলসুপার


হ্যাঁ, আপনি এখানে মাথায় পেরেক আঘাত। ধন্যবাদ
এসএমবিগস

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

4
এগুলি বাদে অন্য সমস্ত উত্তর সম্পূর্ণ বিষ্ঠা। গ্রহণ করা উচিত।
Le_Enot

4
@ রিজওয়ানসোহাইব এটি আপনাকে কিছু করতে বাধ্য করবে না। এটি হাইলাইট করবে এবং আপনাকে জানাতে হবে যে আপনাকে এটি কল করতে হবে। আরও জটিল কিছু করার জন্য আপনার প্রয়োজন হয় একটি এ্যানোটেশন প্রসেসর বা নিজেকে যুক্তি বাস্তবায়ন করতে হবে। আইডিই এর উপর নির্ভর করে এটি আপনাকে বিল্ডিং থেকে বাঁচানো উচিত should
হিমশীতল

4
নিখুঁত উত্তর. অনেক অনেক ধন্যবাদ
Võ Quang Hòa

82

আপনি যদি পিতামাত্ত শ্রেণীর যুক্তি প্রয়োগ করতে সাবক্লাসগুলি বাধ্য করতে চান তবে একটি সাধারণ প্যাটার্ন হ'ল নিম্নলিখিতগুলির মতো:

public abstract class SuperClass implements SomeInterface
{
    // This is the implementation of the interface method
    // Note it's final so it can't be overridden
    public final Object onCreate()
    {
        // Hence any logic right here always gets run
        // INSERT LOGIC

        return doOnCreate();

        // If you wanted you could instead create a reference to the
        // object returned from the subclass, and then do some
        // post-processing logic here
    }

    protected abstract Object doOnCreate();
}

public class Concrete extends SuperClass
{
    @Override
    protected Object doOnCreate()
    {
        // Here's where the concrete class gets to actually do
        // its onCreate() logic, but it can't stop the parent
        // class' bit from running first

        return "Hi";
    }
}

এটি বাস্তবে বাস্তবায়নে একটি সুপারক্লাস কল automaticallyোকাতে কীভাবে গ্রহনকে অনুরোধ জানায় তা সম্পর্কে আপনার প্রশ্নের উত্তর দেয় না; তবে তবে আমি মনে করি না যে এটি যাইহোক উপায় কারণ এটি সর্বদা মোছা যেতে পারে।

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


8

যদি আপনি একেবারে নিশ্চিত করতে চান যে সুপারক্লাস-পদ্ধতিটিকেও বলা হয়, তবে আপনাকে অবশ্যই কিছুটা কৌতুক করতে হবে: সুপারক্লাস-পদ্ধতিটি ওভাররাইট করার অনুমতি দিবেন না, তবে এটি একটি অতিমাত্রায়িত সুরক্ষিত পদ্ধতিতে কল করুন।

class Super
{
   public final void foo() {
      foo_stuff();
      impl_stuff();
   }

   protected void impl_stuff() {
      some_stuff_that_you_can_override();
   }
}

class Base extends Super
{
  protected void impl_stuff() { 
     my_own_idea_of_impl();
  }
}

এইভাবে, ব্যবহারকারীকে সুপার.ফু () বা বেস.ফু () কল করতে হবে এবং এটি চূড়ান্ত হিসাবে ঘোষিত হওয়ায় এটি সর্বদা বেস-শ্রেণীর সংস্করণ হবে। বাস্তবায়ন-নির্দিষ্ট স্টাফগুলি ইমপ্লি_স্টফ () এ রয়েছে, যা ওভাররেড করা যায়।


8

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

class Activity
{
  onCreate()
  {
    superCalled = true;
    ...
  }
  ...
}

এবং "সিস্টেম" স্তরের শ্রেণিতে যা অভিপ্রায় গ্রহণ করে এবং এটি থেকে ক্রিয়াকলাপ অবজেক্টটি ইনস্ট্যান্ট করে:

...
SomeActivitySubclass someActivitySubclassObject = new SomeActivitySubclass();
someActivitySubclassObject.onCreate();
if (!someActivityObject.isSuperCalled())
{
  Exception e = new Exception(...) //create an exception with appropriate details
  throw e;
}

আমার ধারণা এটি সম্ভবত এর চেয়ে কিছুটা জটিল, তবে আপনি ধারণাটি পেয়ে যান। গ্রহণটি স্বয়ংক্রিয়ভাবে কলটি তৈরি করে কারণ এডিটি প্লাগইন এটি একটি সুবিধার্থে বলে। শুভ কোডিং!


4

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


3

ইগ্রিপস কেবল সহায়ক হচ্ছে, আপনাকে মনে করিয়ে দিচ্ছে যে আপনি চাইলে সুপারক্লাস বাস্তবায়নকে কল করতে পারেন।

আপনি সম্ভবত একটি ত্রুটি পেয়ে যাচ্ছেন কারণ আপনি সুপারক্লাসের মতো প্রয়োজনীয় কিছু করছেন না, যেহেতু আপনি এর বাস্তবায়নটিকে কল করছেন না।


1

গ্রহন কেবল আপনাকে জিনিসগুলি সঠিকভাবে করতে এবং ব্যতিক্রমগুলি এড়াতে সহায়তা করে।

Http://developer.android.com/references/android/app/Activity.html#onCreate(android.os.Bundle থেকে )

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.