স্কেল কনস্ট্রাক্টর ওভারলোড?


উত্তর:


186

এটি স্পষ্টভাবে উল্লেখ করার মতো যে, স্কালায় সহায়তাকারী কনস্ট্রাক্টরকে তাদের প্রথম ক্রিয়া হিসাবে প্রাথমিক কন্সট্রাক্টরকে (ল্যান্ডন9720 এর মতো) উত্তর বা একই শ্রেণীর অন্য সহায়ক কন্সট্রাক্টরকে কল করতে হবে। তারা জাভাতে যেমন সুপারক্লাসের নির্মাতাকে স্পষ্টভাবে বা স্পষ্টভাবে কল করতে পারে না। এটি নিশ্চিত করে যে প্রাথমিক নির্মাতা ক্লাসে প্রবেশের একমাত্র পয়েন্ট।

class Foo(x: Int, y: Int, z: String) {  
  // default y parameter to 0  
  def this(x: Int, z: String) = this(x, 0, z)   
  // default x & y parameters to 0
  // calls previous auxiliary constructor which calls the primary constructor  
  def this(z: String) = this(0, z);   
}

@ জোন ম্যাকআলিফ: খারাপ উদাহরণ? দ্বিতীয় ও তৃতীয় কনস্ট্রাকটর ছাড়া, ব্যবহারকারী তবুও কল করতে পারেন new Foo(x=2,z=4)এবং new Foo(z=5)যদি আপনি আপনার প্রথম লাইন পরিবর্তনclass Foo(x: Int = 0, y: Int = 0, z: String) {
user2987828

নামযুক্ত / ডিফল্ট আর্গুমেন্ট স্কেলা ২.৮ অবধি পৌঁছায় না।
জন ম্যাকআলিফ

2
ওভারলোড কনস্ট্রাক্টর কীভাবে ব্যবহার করবেন তা উল্লেখ করা উচিত। এটি মামুলি নয় যে newএমনকি কেস ক্লাসের জন্য কীওয়ার্ডটি প্রয়োজনীয়।
রেডরেন


16

স্কেলা ২.৮.০ অনুসারে আপনার কনট্রাক্টর এবং পদ্ধতি পরামিতিগুলির জন্য ডিফল্ট মান থাকতে পারে। এটার মত

scala> class Foo(x:Int, y:Int = 0, z:Int=0) {                           
     | override def toString() = { "Foo(" + x + ", " + y + ", " + z + ")" }
     | }
defined class Foo

scala> new Foo(1, 2, 3)                                                    
res0: Foo = Foo(1, 2, 3)

scala> new Foo(4)                                                          
res1: Foo = Foo(4, 0, 0)

প্যারামিটার তালিকায় কোনও ডিফল্ট মান না থাকলে ডিফল্ট মানগুলির সাথে পরামিতিগুলি অবশ্যই আসতে হবে।


3
যদিও এটি তুচ্ছ ত্রুটিযুক্ত ডিফল্টগুলির জন্য কাজ করে না। সুতরাং class Foo(val x:Int, y:Int=2*x)কাজ করে না।
সাবউব

@ জারজেন লুন্ডবার্গ: আপনি লিখেছেন যে ডিফল্ট মানগুলির সাথে পরামিতিগুলির অবশ্যই প্যারামিটার তালিকার কোনও ডিফল্ট মান না থাকা উচিত। এটা ভুল, new Foo(x=2,z=4)মুদ্রণ করবে Foo(2,0,4)
ব্যবহারকারী 2987828

@ ইউজার ২৮৮78৮৮ I বলতে আমি বোঝাতে চাইছিলাম আপনি নতুন ফু (12, x = 2) লিখতে পারবেন না আপনাকে অবশ্যই নতুন ফু লিখতে পারেন (x = 2, 12)। আপনি নতুন ফু লিখতে পারেন (12, y = 2), তারপরে আপনি ফু পাবেন (12, 2, 0)
জর্জেন লুন্ডবার্গ

10

আমার কোডটি দেখার সময় আমি হঠাৎ বুঝতে পারি যে আমি কোনও নির্মাণকারীর ওভারলোডের মতো কাজ করেছি। আমি তখন সেই প্রশ্নটির কথা মনে রেখে আবার ফিরে এসেছি:

স্কালায় আপনি কনস্ট্রাক্টরদের ওভারলোড করতে পারবেন না, তবে আপনি এটি ফাংশন দিয়ে করতে পারেন।

এছাড়াও, অনেকে applyসঙ্গীর কাজটিকে সংশ্লিষ্ট শ্রেণীর জন্য একটি কারখানা তৈরির উদ্দেশ্যে পছন্দ করে ।

এই শ্রেণীর বিমূর্ততা তৈরি করা এবং এই ক্লাসটি applyবাস্তবায়ন-ইনস্ট্যান্ট করার জন্য ফাংশনটি ওভারলোড করা, আপনার নিজের ওভারলোডড "কনস্ট্রাক্টর" রয়েছে:

abstract class Expectation[T] extends BooleanStatement {
    val expected: Seq[T]}

object Expectation {
    def apply[T](expd:     T ): Expectation[T] = new Expectation[T] {val expected = List(expd)}
    def apply[T](expd: Seq[T]): Expectation[T] = new Expectation[T] {val expected =      expd }

    def main(args: Array[String]): Unit = {
        val expectTrueness = Expectation(true)}
}

নোট করুন যে আমি প্রত্যেকে applyপ্রত্যাবর্তনের জন্য স্পষ্টভাবে সংজ্ঞায়িত করেছি Expectation[T], অন্যথায় এটি হাঁসের মতো টাইপ করবে Expectation[T]{val expected: List[T]}


0

এটা চেষ্টা কর

class A(x: Int, y: Int) {
  def this(x: Int) = this(x, x)
  def this() = this(1)
  override def toString() = "x=" + x + " y=" + y
  class B(a: Int, b: Int, c: String) {
    def this(str: String) = this(x, y, str)
    override def toString() =
      "x=" + x + " y=" + y + " a=" + a + " b=" + b + " c=" + c
  }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.