যখন রিটার্নের ধরনগুলি স্পষ্টভাবে না দেওয়া হয় তখন কেন একটি পদ্ধতি রিটার্নিং ইউনিট মেথড রিটারিং স্ট্রিং দিয়ে ওভাররাইড করা যায়?


11

আমি স্কেল সংস্করণে https://www.artima.com/pins1ed/traits.html তে ট্র্যাটিট ইন প্রোগ্রামিং বিষয়ক অধ্যায় থেকে কোড উদাহরণগুলির মাধ্যমে কাজ করছিলাম

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

trait Philosophical {
    def philosophize = println("I consume memory, therefore I am!")
}

class Frog extends Philosophical {
  override def toString = "green"
  override def philosophize = "It aint easy to be " + toString + "!"
}

val frog = new Frog
//frog: Frog = green

frog.philosophize
// no message printed on console

val f = frog.philosophize
//f: Unit = ()

তবে আমি যখন ওভাররাইড পদ্ধতিতে সুস্পষ্ট রিটার্ন টাইপ দেব তখন এটি একটি সংকলন ত্রুটি দেয়:

class Frog extends Philosophical {
  override def toString = "green"
  override def philosophize: String = "It aint easy to be " + toString + "!"
}
         override def philosophize: String = "It aint easy to be " + toString +
                      ^
On line 3: error: incompatible type in overriding
       def philosophize: Unit (defined in trait Philosophical);
        found   : => String
        required: => Unit

প্রথম ক্ষেত্রে কোনও সংকলন ত্রুটি কেন কেউ ব্যাখ্যা করতে সহায়তা করতে পারে।


সংকলক একটি বৈধ ইঙ্গিত মুদ্রিত করেছে যে আপনি কোনও পদ্ধতির ওভাররাইড করার চেষ্টা করছেন যার ফলশ্রুতি আলাদা।
Andriy Plokhotnyuk

হ্যাঁ সত্যিই, তবে আমার প্রশ্নটি এটি কেন প্রথম সংকলকের মাধ্যমে পেয়েছিল
শানিল

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

উত্তর:


8

যখন প্রত্যাশিত প্রকার হয় Unit, কোনও মান গ্রহণ করা যায় :

মান বাতিল হচ্ছে

যদি eকিছু মান টাইপ এবং প্রত্যাশিত ধরনের Unit, eমেয়াদে এটা এম্বেড করার মাধ্যমে প্রত্যাশিত টাইপ রূপান্তরিত হয় { e; () }


6

আমার প্রশ্ন এটি কেন প্রথম ক্ষেত্রে সংকলকের মাধ্যমে পেয়েছে

আপনি যখন রিটার্নের ধরণটি স্পষ্টভাবে নির্দিষ্ট না overrideকরে কাজ করার জন্য এটি যে ধরণের প্রয়োজন তা দ্বারা অনুমান করা হয়েছিল ।

যে পরিণত হয়েছে Unit

যেহেতু Stringমানগুলি (ফাংশন বডি তৈরির মত প্রকাশের মান) নির্ধারিত হতে পারে Unitতাই সংকলকটি খুশি।


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

1
এই সংকলনগুলি উদাহরণস্বরূপ:trait Philosophical { def philosophize : Number = 1 } class Frog extends Philosophical { override def philosophize : Integer = 2 }
থিলো

2
আপনি রিটার্নের প্রকারটি উপ-টাইপের সাথে সংকুচিত করতে পারেন; তবে আপনি এটিকে এমন ধরণের সংকীর্ণ করতে পারবেন না যা কেবলমাত্র ওভাররাইড পদ্ধতির রিটার্নের ধরণে স্পষ্টভাবে রূপান্তরিত হতে পারে। Stringথেকে Unitএমনকি যদি তা না হয়, আরো দ্বিতীয় মত হল ঠিক যে।
অ্যালেক্সি রোমানভ

2
বাইটকোড স্তরে কোনও সংকীর্ণ রিটার্নের ধরণ নেই, এখানে আসলে দুটি পদ্ধতি রয়েছে Frog: def philosophize : Integerএবং def philosophize : Number। দ্বিতীয়টি আসলে Philosophicalএর পদ্ধতিটিকে ওভাররাইড করে (এবং প্রথমটিকে কল করে)। একইভাবে void/ অন্য যে কোনও কিছুর জন্য অবশ্যই করা যেতে পারে , ডিজাইনাররা কেবল এটি না করার সিদ্ধান্ত নিয়েছে।
অ্যালেক্সি রোমানভ

2
1. জাভা একই কাজ করে। হ্যাঁ, বাইটকোডে আপনি পারেন can উদাহরণস্বরূপ স্ট্যাকওভারফ্লো / প্রশ্ন / 18655541/ … এবং স্ট্যাকওভারফ্লো . com/ প্রশ্নগুলি / ৫৮০65666০/২ দেখুন
অ্যালেক্সি রোমানভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.