প্রকারটি অন্তর্ভুক্ত করে স্বয়ংক্রিয় ডাউনকাস্টিং


11

জাভাতে, আপনার একটি ভেরিয়েবল ডাউনকাস্ট করতে অবশ্যই স্পষ্টভাবে কাস্ট করতে হবে

public class Fruit{}  // parent class
public class Apple extends Fruit{}  // child class

public static void main(String args[]) {
    // An implicit upcast
    Fruit parent = new Apple();
    // An explicit downcast to Apple
    Apple child = (Apple)parent;
}

এই প্রয়োজনের কোনও কারণ কি, জাভা কোনও ধরণের অনুক্রম ব্যবহার করে না?

নতুন ভাষায় স্বয়ংক্রিয়ভাবে ডাউনকাস্টিং বাস্তবায়নের সাথে কি কোনও "গোটচস" রয়েছে?

এই ক্ষেত্রে:

Apple child = parent; // no cast required 

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

উত্তর:


24

উপাসনা সর্বদা সফল।

ডাউনকাস্টগুলি রানটাইম ত্রুটির কারণ হতে পারে, যখন অবজেক্ট রানটাইম টাইপটি theালাইতে ব্যবহৃত টাইপের উপপ্রকার নয়।

যেহেতু দ্বিতীয়টি বিপজ্জনক অপারেশন, তাই বেশিরভাগ টাইপযুক্ত প্রোগ্রামিং ভাষাগুলির জন্য প্রোগ্রামারকে এটির জন্য স্পষ্টভাবে জিজ্ঞাসা করা প্রয়োজন। মূলত, প্রোগ্রামার সংকলকটিকে বলছে "বিশ্বাস করুন, আমি আরও ভাল জানি - রানটাইমের সময় এটি ঠিক থাকবে"।

যখন টাইপ সিস্টেমগুলি উদ্বিগ্ন হয়, আপকাস্টগুলি প্রুফের বোঝাটি সংকলকটিতে রাখে (যা এটি স্ট্যাটিকালি চেক করতে হয়), ডাউনকাস্টগুলি প্রমাণের বোঝা প্রোগ্রামারকে রেখে দেয় (এটি সম্পর্কে কঠোর চিন্তা করতে হবে)।

যে কেউ তর্ক করতে পারে যে সঠিকভাবে ডিজাইন করা প্রোগ্রামিং ল্যাঙ্গুয়েজ ডাউনকাস্টগুলি পুরোপুরি নিষিদ্ধ করবে, বা নিরাপদ ক্যাস্টের বিকল্প সরবরাহ করবে, যেমন optionচ্ছিক প্রকার ফেরত দেওয়া Option<T>। যদিও অনেক বিস্তৃত ভাষা কেবল ফিরে আসা Tএবং অন্যথায় ত্রুটি উত্থাপনের সহজ এবং আরও বাস্তববাদী পদ্ধতির পছন্দ করে ।

আপনার নির্দিষ্ট উদাহরণে, সংকলকটি parentহ'ল এটি Appleএকটি সাধারণ স্ট্যাটিক বিশ্লেষণের মাধ্যমে হ্রাস করার জন্য ডিজাইন করা যেতে পারে এবং অন্তর্নিহিত কাস্টের অনুমতি দেয়। তবে সাধারণভাবে সমস্যাটি অনস্বীকার্য, সুতরাং আমরা কম্পাইলারটি খুব বেশি যাদু করার আশা করতে পারি না।


1
কেবলমাত্র রেফারেন্সের জন্য, এমন একটি ভাষার উদাহরণ যা alsচ্ছিকগুলিকে হ্রাস করে তা মরিচা, তবে এটির কারণ সত্যিকারের উত্তরাধিকার নেই, কেবল একটি "কোনও প্রকার"
Kroltan

3

সাধারণত ডাউনকাস্টিং হ'ল আপনি যখন যা করেন তার স্ট্যাটিকালি জ্ঞাত সংকলনটি কোনও কিছুর ধরণের সম্পর্কে যা জানেন তা থেকে কম নির্দিষ্ট হয় (বা কমপক্ষে আশা)।

আপনার উদাহরণের মতো পরিস্থিতিতে, অবজেক্টটি একটি হিসাবে তৈরি হয়েছিল Appleএবং তারপরে সেই জ্ঞানটি প্রকারের একটি ভেরিয়েবলের মধ্যে রেফারেন্সটি সংরক্ষণ করে ফেলে দেওয়া হয়েছিল Fruit। তারপরে আপনি Appleআবার একই রেফারেন্সটি ব্যবহার করতে চান ।

যেহেতু তথ্য শুধুমাত্র দূরে নিক্ষিপ্ত হয়েছিল "স্থানীয়ভাবে", নিশ্চিত, কম্পাইলার যে জ্ঞান বজায় রাখতে পারে parentসত্যিই একটি হয় Apple, যদিও তার ঘোষিত ধরনের Fruit

তবে সাধারণত কেউ তা করেন না। আপনি যদি একটি তৈরি করতে চান Appleএবং এটি একটি হিসাবে ব্যবহার করতে চান তবে আপনি Appleএটিকে Appleভেরিয়েবলের মধ্যে সঞ্চয় করেন , একটিটি নয় Fruit

আপনার যদি একটি থাকে Fruitএবং এটি হিসাবে ব্যবহার করতে চান Appleএটির অর্থ সাধারণত আপনি Fruitকোনও উপায়ে অর্জন করেছেন যা সাধারণত যে কোনও ধরণের ফিরিয়ে দিতে পারে Fruit, তবে এই ক্ষেত্রে আপনি জানেন এটি একটি ছিল Apple। প্রায় সর্বদা আপনি কেবল এটি নির্মাণ করেননি, আপনি এটি অন্য কোনও কোড দ্বারা পাস করেছেন।

একটি সুস্পষ্ট উদাহরণ হ'ল যদি আমার এমন কোনও parseFruitফাংশন থাকে যা "আপেল", "কমলা", "লেবু" ইত্যাদির মতো স্ট্রিংগুলিকে উপযুক্ত উপক্লাসে পরিণত করতে পারে; সাধারণত আমরা (এবং সংকলক) এই ফাংশন সম্পর্কে জানতে পারি এটি কোনওরকম ফেরত দেয় Fruitতবে আমি যদি কল করি parseFruit("apple")তবে আমি জানি যে এটি একটি কল করতে চলেছে Appleএবং Appleপদ্ধতিগুলি ব্যবহার করতে চাইতে পারে , তাই আমি ডাউনকাস্ট করতে পারি।

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

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


3

আপনি লাইনটি কোথায় আঁকতে চান এটি বিষয়। আপনি এমন একটি ভাষা ডিজাইন করতে পারেন যা অন্তর্নিহিত ডাউনকাস্টের বৈধতা সনাক্ত করবে:

public static void main(String args[]) { 
    // An implicit upcast 
    Fruit parent = new Apple();
    // An implicit downcast to Apple 
    Apple child = parent; 
}

এখন, একটি পদ্ধতি বের করুন:

public static void main(String args[]) { 
    // An implicit upcast 
    Fruit parent = new Apple();
    eat(parent);
}
public static void eat(Fruit parent) { 
    // An implicit downcast to Apple 
    Apple child = parent; 
}

আমরা এখনও ভাল। স্থির বিশ্লেষণ অনেক কঠিন তবে এখনও সম্ভব।

তবে সমস্যাটি খুব দ্বিতীয় দ্বিতীয়টি পপ আপ করে দেয় কেউ:

public static void causeTrouble() { 
    // An implicit upcast 
    Fruit trouble = new Orange();
    eat(trouble);
}

এখন, আপনি কোথায় ত্রুটি বাড়াতে চান? এটি একটি দ্বিধা সৃষ্টি করে, কেউ বলতে পারেন যে সমস্যাটি রয়েছে Apple child = parent;তবে এটি "তবে এটি আগে কাজ করেছিল" দ্বারা প্রত্যাখাত হতে পারে। অন্যদিকে, eat(trouble);সমস্যাটি যুক্ত করার ফলে ", তবে পলিমারফিজমের পুরো বিন্দুটি হ'ল এটির অনুমতি দেওয়া।

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

বিটিডাব্লু, জাভাতে আপনার বর্ণিত ডাউনকাস্টটি আসলে একটি ডাউনকাস্ট নয়। এটি একটি সাধারণ castালাই, যা কমলাতে আপেলও কাস্ট করতে পারে। সুতরাং, প্রযুক্তিগতভাবে @ চি এর ধারণাটি ইতিমধ্যে এখানে রয়েছে, জাভাতে কোনও ডাউনকাস্ট নেই, কেবলমাত্র "এরিক্লাস্ট"। এটি একটি বিশেষায়িত ডাউনকাস্ট অপারেটর ডিজাইন করা বোধগম্য হবে যে সংকলনের ত্রুটিটি ছুঁড়ে ফেলবে যখন ফলাফলের ধরণটি যুক্তির ধরণ থেকে প্রবাহের ধরণটি খুঁজে পাওয়া যায় না। খুব ভাল কারণ ছাড়াই প্রোগ্রামারদের এটির ব্যবহার থেকে নিরুৎসাহিত করার জন্য "Everycast" ব্যবহার করা আরও বেশি কঠিন কাজ করা ভাল ধারণা হবে। সি ++ এর XXXXX_cast<type>(argument)সিনট্যাক্স মাথায় আসে।

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