স্কালায় সঙ্গী অবজেক্ট থাকার পিছনে যুক্তি কী?


107

এমন কোনও মামলা আছে যেখানে কোনও শ্রেণীর জন্য কোনও সহযোগী অবজেক্ট (সিঙ্গলটন) প্রয়োজন? আমি কেন Fooএটির জন্য কোনও ক্লাস তৈরি করতে, বলতে এবং তার সাথে একটি সহযোগী অবজেক্ট তৈরি করতে চাই?



আরও দেখুন stackoverflow.com/a/9806136/736957 যা এখানে উত্তর একটি ভাল সংকলন হয়
laughedelic

উত্তর:


82

সহচর অবজেক্টটি মূলত এমন একটি জায়গা সরবরাহ করে যেখানে কেউ "স্ট্যাটিক-জাতীয়" পদ্ধতি রাখতে পারে। তদ্ব্যতীত, কোনও সহকর্মী অবজেক্ট বা সহকর্মী মডিউলটির ব্যক্তিগত সদস্যরা সহ শ্রেণীর সদস্যদের কাছে সম্পূর্ণ অ্যাক্সেস রয়েছে।

কারখানার পদ্ধতিগুলির মতো এনক্যাপসুলেট করার জন্য কমপেনিয়ান অবজেক্টগুলি দুর্দান্ত। উদাহরণস্বরূপ, Fooএবং FooFactoryসর্বত্র থাকার পরিবর্তে , আপনি কারখানার দায়িত্ব নিতে কোনও সহকর্মী অবজেক্ট সহ একটি ক্লাস রাখতে পারেন।


61

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

abstract class AnimalCounter
{
    var animals = 0

    def name: String

    def count()
    {
        animals += 1
        println("%d %ss created so far".format(animals, name))
    }
}

abstract class Animal
{
    def companion: AnimalCounter
    companion.count()
}

object Dog extends AnimalCounter
{
    val name = "dog"
}

class Dog extends Animal
{
    def companion = Dog
}

object Cat extends AnimalCounter
{
    val name = "cat"
}

class Cat extends Animal
{
    def companion = Cat
}

যা এই আউটপুট উত্পাদন করে:

scala> new Dog
1 dogs created so far

scala> new Cat
1 cats created so far

scala> new Dog
2 dogs created so far

scala> new Cat
2 cats created so far

1
অনুরূপ চিত্র এখানেও পাওয়া যাবে: दैनिक-scala.blogspot.sk/2009/09/companion-object.html
xhudik

30

... এবং সহপাঠী ক্লাসগুলির জন্য স্থির কারখানার পদ্ধতিগুলি (যে ডিপি নয়) সঞ্চয় করার জন্য এটি ভাল জায়গা। আপনি যদি ওভারলোডেড ফ্যাক্টরি পদ্ধতিগুলির নাম প্রয়োগ করেন (/ ... /) আপনি শ্রেণি তৈরি / আরম্ভ করতে সক্ষম হবেন

  1. 'নতুন' ব্যতীত (আসলেই তা গুরুত্বপূর্ণ নয়)

  2. বিভিন্ন প্যারামিটারের বিভিন্ন সেট সহ (টেলিস্কোপিং কনস্ট্রাক্টর সম্পর্কে কার্যকর জাভাতে ব্লাচ যা লেখেন তার সাথে তুলনা করুন)

  3. অ্যাবস্ট্রাক্ট (সহ) একের পরিবর্তে আপনি কোন উত্সর্গীকৃত বর্গ তৈরি করতে চান তা সিদ্ধান্ত নেওয়ার ক্ষমতা নিয়ে

উদাহরণ কোড:

abstract class AbstractClass;
class RealThing(s: String) extends AbstractClass;
class AlternativeThing(i: Int) extends AbstractClass;
object AbstractClass {
  def apply(s: String) = {
    new RealThing(s)
  }
  def apply(i: Int) = {
    new AlternativeThing(i)
  }
}

// somewhere else you can
val vs = AbstractClass("asdf")  // gives you the RealThing wrapped over string
val vi = AbstractClass(123)  // gives you AlternativeThing wrapped over int

আমি অবজেক্ট / বেস ক্লাসটি অ্যাবস্ট্রাকএক্সএক্সএক্সএক্সএক্সএক্স কল করব না কারণ এটি খারাপ দেখাচ্ছে না: যেমন বিমূর্ত কিছু তৈরি করার মতো। এই নামগুলির একটি আসল অর্থ দিন। অপরিবর্তনীয়, পদ্ধতি কম, কেস ক্লাস এবং অ্যাবস্ট্রাক্ট বেস ক্লাসটি সিল করার জন্য বিবেচনা করুন।


2
RealThingএবং AlternativeThingক্লাসে privateব্যবহারকারীকে AbstractClassকারখানাটি ব্যবহার করতে বাধ্য করার জন্য একজন কনস্ট্রাক্টর থাকা উচিত । class AlternativeThing private(i: Int) extends AbstractClass
মেচ

@ [সিজমন জাখিম] স্কালা বিমূর্ত শ্রেণি একাধিক উত্তরাধিকার সমর্থন করে না। সুতরাং সংকলকটি আপনার ক্ষেত্রে এটির অনুমতি দেয় কেন?
ব্যবহারকারী 2441441

19

সায়েম তার উত্তরে যা বলেছিল সেগুলি ছাড়াও , স্কালা সংকলক অন্তর্নিহিত রূপান্তরগুলির সন্ধান করে সংশ্লিষ্ট সহচর বস্তু (হয় উৎস বা লক্ষ্য) এ ধরনের, তাই ধর্মান্তর আমদানি করতে হবে না।

স্কেলে সাধারণ প্রোগ্রামিংয়ে সিঙ্গলটন অবজেক্টের কারণ সম্পর্কে বলেছেন:

অধ্যায় 1-তে উল্লিখিত হিসাবে, স্ক্যালার ক্লাসগুলির স্থির সদস্য থাকতে পারে না এমন এক উপায়ে জাভা থেকে স্কেলাকে বেশি অবজেক্ট ভিত্তিক বলা যেতে পারে। পরিবর্তে, স্কালায় সিঙ্গলটন অবজেক্টস রয়েছে (পৃষ্ঠা 65)।


3

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

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


0

আপনি যদি একই নামের সাথে একই ফাইলে শ্রেণি এবং অবজেক্টকে সংজ্ঞায়িত করেন তবে তারা সহযোগী শ্রেণি এবং অবজেক্ট হিসাবে পরিচিত। স্কালায় জাভা কীওয়ার্ড হিসাবে স্ট্যাটিক নেই, আপনি স্ক্যালায় সাথী ক্লাস এবং অবজেক্টের সাথে স্থির প্রতিস্থাপন হিসাবে নিতে পারেন।

আরও বিশদ তথ্যের জন্য দয়া করে স্কেল প্রোগ্রামিংয়ে নিবন্ধের ক্লাস এবং অবজেক্ট কীওয়ার্ডটি পরীক্ষা করুন check


-1

প্রথমে এটি স্ট্যাটিক বনাম অ স্থিত পদ্ধতি পদ্ধতিগুলির স্পষ্ট বিভাজন সরবরাহ করে single এছাড়াও সিঙ্গলটন ক্লাস তৈরির একটি সহজ উপায় সরবরাহ করে।

এটি অন্যান্য ক্লাস এবং / অথবা বৈশিষ্ট্যগুলি থেকেও পদ্ধতি অর্জন করতে পারে যা জাভা স্ট্যাটিক পদ্ধতিতে করা যায় না and এবং প্যারামিটার হিসাবে পাস করা যেতে পারে।

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