কেন সুইফট সাবক্লাসটি প্রথমে যথাযথ ক্ষেত্রের সূচনা করে?


9

ভাষা সুইফ্টে, উদাহরণের সূচনা করার জন্য, একটিটিকে class শ্রেণীর সমস্ত ক্ষেত্র পূরণ করতে হবে এবং কেবল তখনই সুপার কনস্ট্রাক্টরকে কল করতে হবে:

class Base {
    var name: String

    init(name: String) {
        self.name = name
    }
}

class Derived: Base {
    var number: Int

    init(name: String, number: Int) {
        // won't compile if interchange lines
        self.number = number
        super.init(name)
    }
}

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

এছাড়াও, জাভাস্ক্রিপ্ট, এবং এমনকি অবজেক্টিভ সি, যা কিছুটা আধ্যাত্মিক পূর্বসূরী সুইফটের পূর্বের ভাষা, যেমন অ্যাক্সেসের আগে চেইন কল প্রয়োজন self, পরে নয় after

সুপারকন্সট্রাক্টরকে কল করার আগে ক্ষেত্রগুলি সংজ্ঞায়িত করার জন্য এই পছন্দ করার পিছনে যুক্তি কী?


মজাদার. শৃঙ্খলার পরে পদ্ধতি আহ্বানগুলি (ভার্চুয়াল, বিশেষত) স্থাপন করা যেতে পারে, যেমন কেবল বলুন? সি # তে, একটি সাবক্লাসের ক্ষেত্রগুলিকে ডিফল্ট মান দেওয়া হয়, তারপরে শৃঙ্খলাবদ্ধ / সুপারক্লাস নির্মাণ করা হয়, তারপরে আপনি এগুলি বাস্তবের জন্য শুরু করতে পারেন, আইআইআরসি ..
এরিক tদ

3
মুল বক্তব্যটি হ'ল আপনি সীমাহীন অ্যাক্সেসের অনুমতি দেওয়ার আগে আপনাকে সমস্ত ক্ষেত্র আরম্ভ করতে হবে self
কোডসইনচাউস

@ এরিকইডট: সুইফটে, কেবলমাত্র alচ্ছিক ক্ষেত্রগুলি স্বয়ংক্রিয়ভাবে শূন্য হয়ে যায়।
gnasher729

উত্তর:


9

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

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

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

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


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

এটি কি শুরু থেকেই কোনও উত্পন্ন বস্তু, বা ভাষা-বিধিগুলি অ-পর্যবেক্ষণযোগ্য করে তোলে? আমি মনে করি এটি পরেরটি।
উত্সাহক 14

9

এটি ভাষাটির ডক এর সূচনা পৃষ্ঠায় দ্বি-পর্বের সূচনা বিভাগে ব্যাখ্যা করা অনুসারে সুইফটের সুরক্ষা বিধি থেকে এসেছে ।

এটি নিশ্চিত করে যে প্রতিটি ক্ষেত্র ব্যবহারের আগে সেট করা আছে (উদাহরণস্বরূপ পয়েন্টার, ক্র্যাশগুলি এড়ানোর জন্য)।

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

তারপরে তারা আরও সূচনা করতে পারে, আশ্বাস দিয়েছিল যে বস্তুটি সুগঠিত। বিশেষত, সমস্ত অ-alচ্ছিক পয়েন্টারগুলির বৈধ মান থাকবে। তাদের জন্য বৈধ নয়।

0 বা নীল সর্বদা একটি কার্যকর মান ব্যতীত সি সি এর চেয়ে আলাদা নয়, সুতরাং প্রথম পর্বের সূচনাটি বরাদ্দকারী কেবলমাত্র সমস্ত ক্ষেত্রকে 0 এ সেট করে থাকেন Also এছাড়াও, সুইফটে অপরিবর্তনীয় ক্ষেত্র রয়েছে, সুতরাং তাদের অবশ্যই প্রথম পর্যায়ে প্রাথমিক হতে হবে । এবং সুইফ্ট এই সুরক্ষা বিধি প্রয়োগ করে।


অবশ্যই এটি এমআই এর সাথে অনেক বেশি শক্ত হবে।
উত্সাহক 14

3

বিবেচনা

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

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

আপনি যদি এই সমস্যাগুলি একটি দুর্দান্ত উপায়ে সমাধান করতে পারেন তবে "গো" পাস করবেন না, সরাসরি আপনার পিএইচডি সংগ্রহের দিকে এগিয়ে যান ...

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