স্কালায় স্ব-ধরণের এবং বৈশিষ্ট্যের উত্তরাধিকারের মধ্যে পার্থক্য কী?


9

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

স্ব-প্রকারের সাথে উত্তরাধিকারের সাথে নয়, এবং তদ্বিপরীত দিয়ে এমন কিছু কী করা যায়?

আমার কাছে, দুজনের মধ্যে কিছু পরিমাণের, শারীরিক পার্থক্য থাকা উচিত, অন্যথায় তারা কেবল নামমাত্র ভিন্ন।

বৈশিষ্ট্য A যদি বি বা স্ব-ধরণের বি প্রসারিত করে, তবে তারা উভয়ই চিত্রিত করে না যে বি হওয়া একটি প্রয়োজনীয়? কোথায় পার্থক্য?


আমি যে শর্তগুলি আপনি অনুগ্রহ করে সেটাকে আমি সতর্ক করছি। একটি জিনিস জন্য, "শারীরিক" পার্থক্য নির্ধারণ করুন, প্রদত্ত যে এটি সমস্ত সফ্টওয়্যার। তার পরেও যে, কোন যৌগিক বস্তু আপনি mixins যাই তৈরি জন্য, আপনি সম্ভবত কিছু ফাংশনে আনুমানিক উত্তরাধিকার সঙ্গে তৈরি করতে পারেন - আপনি ফাংশন নির্ধারণ বিশুদ্ধরূপে প্রোফাইল পদ্ধতি পরিপ্রেক্ষিতে। যেখানে তারা পৃথক হবে তা এক্সটেনসিবিলিটি, নমনীয়তা এবং সামঞ্জস্যযোগ্যতার মধ্যে রয়েছে।
itbruce

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

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

ঠিক আছে, ভাবেন যে অনুগ্রহ শেষ হওয়ার আগেই আমি এটি চেষ্টা করতে পারি;)
ব্রুস

উত্তর:


11

বৈশিষ্ট্য বি প্রসারিত, তাহলে 'এ মিশ আপনি দেয় অবিকল বি প্লাস যাই হোক না কেন একটি যোগ অথবা প্রসারিত করে। বিপরীতে, যদি বৈশিষ্ট্য A এর স্ব-রেফারেন্স থাকে যা স্পষ্টভাবে বি হিসাবে টাইপ করা থাকে, তবে চূড়ান্ত পিতাম শ্রেণীর বিতে বা বংশধর প্রকারের মধ্যেও মিশ্রিত হওয়া আবশ্যক (এবং এটি প্রথমে মেশান , যা গুরুত্বপূর্ণ)।

এটি সবচেয়ে গুরুত্বপূর্ণ পার্থক্য। প্রথম ক্ষেত্রে, নির্দিষ্ট ধরণের বি বিন্দু এ স্ফটিকযুক্ত হয় এটি প্রসারিত করে। দ্বিতীয়টিতে, প্যারেন্ট ক্লাসের ডিজাইনার সিদ্ধান্ত নিতে পারেন যে বি-এর কোন সংস্করণ ব্যবহৃত হবে, সেই পয়েন্টে যেখানে প্যারেন্ট ক্লাসটি তৈরি করা হয়েছে।

আরেকটি পার্থক্য হ'ল যেখানে A এবং B একই নামের পদ্ধতি সরবরাহ করে। যেখানে A বি প্রসারিত করে, A এর পদ্ধতিটি বি এর ওভাররাইড করে। যেখানে বি এর পরে এ মিশ্রিত হয়, এ এর ​​পদ্ধতিটি কেবল জয়ী হয়।

টাইপযুক্ত স্ব-রেফারেন্স আপনাকে আরও অনেক স্বাধীনতা দেয়; A এবং B এর মধ্যে মিলন আলগা।

হালনাগাদ:

যেহেতু আপনি এই পার্থক্যগুলির সুবিধা সম্পর্কে পরিষ্কার নন ...

আপনি যদি সরাসরি উত্তরাধিকার ব্যবহার করেন তবে আপনি বৈশিষ্ট্য A তৈরি করেন যা বি + এ। আপনি পাথর স্থাপন করেছেন।

আপনি যদি টাইপযুক্ত স্ব-রেফারেন্স ব্যবহার করেন, তবে যে কেউ আপনার C বৈশিষ্ট্য C এ ক্লাসে ব্যবহার করতে চায় সে পারে

  • বি এবং তারপরে এটিকে সি তে মিশ্রিত করুন
  • বি এর একটি উপপ্রকার এবং তারপরে এটিকে সি তে মিশ্রিত করুন
  • সি তে মিশ্রিত করুন, যেখানে সি বি এর একটি সাবক্লাস is

এবং এটি তাদের বিকল্পগুলির সীমা নয়, স্কালাকে আপনি কোনও কোড ব্লকের সাথে এটির নির্মাতা হিসাবে সরাসরি কোনও বৈশিষ্ট ইনস্ট্যান্ট করার অনুমতি দেয় given

এ এর পদ্ধতি জয়ের মধ্যে পার্থক্য হিসাবে , কারণ এটিকে শেষের দিকে বি মিশ্রিত করা হয়, এ বির্ধক বিয়ের সাথে তুলনা করে, এটি বিবেচনা করুন ...

আপনি যেখানে বৈশিষ্ট্যের ক্রমটিতে মিশ্রিত হন, যখনই পদ্ধতিটি foo()আহ্বান করা হয়, সংকলকটি অনুসন্ধানের জন্য মিশ্রিত সর্বশেষ বৈশিষ্ট্যে চলে যায় foo(), তারপরে (যদি না পাওয়া যায়), এটি এমন একটি বৈশিষ্ট্য না খুঁজে পাওয়া যায় যা প্রয়োগ করে foo()এবং ব্যবহার করে যে। super.foo()একটিতে কল করার বিকল্পও রয়েছে , যা প্রয়োগটি না পাওয়া পর্যন্ত এটি বামের ক্রমকেও ঘুরিয়ে দেয়, ইত্যাদি।

সুতরাং A এর বিতে টাইপ করা স্ব-রেফারেন্স থাকলে এবং এ-র লেখক জানেন যে বি প্রয়োগ করে foo(), এ super.foo()জেনে কল করতে পারে যে অন্য কিছু সরবরাহ না করলে foo(), বি করবে। তবে সি শ্রেণীর স্রষ্টার কাছে অন্য কোনও বৈশিষ্ট্য বাদ দেওয়ার বিকল্প রয়েছে যা প্রয়োগ করে foo()এবং এ পরিবর্তে এ তা পাবে।

আবার এটি A কে বি বাড়ানো এবং সরাসরি বি এর সংস্করণটির কল করার চেয়ে অনেক বেশি শক্তিশালী এবং কম সীমাবদ্ধ foo()


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

ওম, আপনি কেন বি এর একটি সাবক্লাস প্রসারিত করতে চান , যদি বি আপনার প্রয়োজনীয়তা নির্ধারণ করে? স্ব-রেফারেন্স বি (বা একটি সাবক্লাস) উপস্থিত হতে বাধ্য করে, তবে টেবি বিকাশকারীকে পছন্দ দেয়? তারা আপনার বৈশিষ্ট্য এ লেখার পরে তারা যে কোনও কিছু লিখেছিল তা মিশ্রিত করতে পারে, যতক্ষণ না এটি বি প্রসারিত হয় ততক্ষণ কেন এগুলিকে কেবলমাত্র বৈশিষ্ট্য এ লেখার সময় কেবল যেটা পাওয়া যায় তার প্রতি কেন সীমাবদ্ধ রাখবেন?
itbruce

পার্থক্যটি সুপার স্পষ্ট করতে আপডেট হয়েছে।
ব্রুস

@itsbruce এর মধ্যে কি কোনও ধারণাগত পার্থক্য রয়েছে? IS-A বনাম HAS-A?
জেস

@ জাস বৈশিষ্ট্য এবং বি এর মধ্যে সম্পর্কের প্রসঙ্গে , উত্তরাধিকার IS-A হয় যখন টাইপ করা স্ব-রেফারেন্সটি এইচএএস-এ দেয় (একটি গঠনমূলক সম্পর্ক)। যে শ্রেণিতে বৈশিষ্ট্যগুলি মিশ্রিত হয়, ফলাফল নির্বিশেষে আইএস-এ হয়
ব্রুস

0

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

trait A1 {
  self: B =>

  def doit {
    println(bar)
  }
}

trait A2 extends B {
  def doit {
    println(bar)
  }
}

trait B {
  def bar = "default bar"
}

trait BX extends B {
  override def bar = "bar bx"
}

trait BY extends B {
  override def bar = "bar by"
}

object Test extends App {
  // object Thing1 extends A1  // FAIL: does not conform to A1 self-type
  object Thing1 extends A1 with B
  object Thing2 extends A2

  object Thing1X extends A1 with BX
  object Thing1Y extends A1 with BY
  object Thing2X extends A2 with BX
  object Thing2Y extends A2 with BY

  Thing1.doit  // default bar
  Thing2.doit  // default bar
  Thing1X.doit // bar bx
  Thing1Y.doit // bar by
  Thing2X.doit // bar bx
  Thing2Y.doit // bar by

  // up-cast
  val a1: A1 = Thing1Y
  val a2: A2 = Thing2Y

  // println(a1.bar)    // FAIL: not visible
  println(a2.bar)       // bar bx
  // println(a2.bary)   // FAIL: not visible
  println(Thing2Y.bary) // 42
}

একটি গুরুত্বপূর্ণ পার্থক্য IMO হ'ল এটি A1প্রকাশ করে না যে এটি এমন Bকোনও কিছুর প্রয়োজন যা কেবল এটি দেখায় A1( যেমন আপ-কাস্ট অংশগুলিতে চিত্রিত)) কেবলমাত্র একটি কোড যা দেখতে পাবে যে একটি বিশেষ বিশেষায়িতকরণ Bব্যবহৃত হয়, তা হ'ল কোড যা স্পষ্টভাবে রচিত টাইপ (যেমন Think*{X,Y}) সম্পর্কে জানে ।

আরেকটি বিষয় হ'ল A2(এক্সটেনশন সহ) আসলে ব্যবহার করবে Bযদি অন্য কিছু নির্দিষ্ট না করা হয় A1(স্ব-টাইপ) না বলে যে এটি ব্যবহার করবে Bনা যদি না ওভাররাইড করা হয়, তখন কংক্রিট বি অবশ্যই স্পষ্টভাবে দিতে হবে যখন বস্তুগুলি তাত্ক্ষণিকভাবে প্রদর্শিত হয়।

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