একই শ্রেণিতে অন্য কোনও সামগ্রীর ব্যক্তিগত ক্ষেত্রে অ্যাক্সেস করুন


91
class Person 
{
   private BankAccount account;

   Person(BankAccount account)
   {
      this.account = account;
   }

   public Person someMethod(Person person)
   {
     //Why accessing private field is possible?

     BankAccount a = person.account;
   }
}

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


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

4
কিছু ভাষা এটি করে না (উদাহরণস্বরূপ নিউজসাইক)। আপনি কেন এটির জন্য একটি ভাল উত্তর পাওয়ার সম্ভাবনা নেই। যা নির্দিষ্ট করা হবে তার থেকে আপনি পিছনে কাজ করে উত্তরগুলি পাবেন।
টম হাটিন -

someMethodবৈধ নয়। এটি কিছুই ফেরায় না। এটা অবশ্যই হবে void
নিকোলাস বারবুলেসকো

4
যদি এটি না হয় তবে কপির কন্সট্রাক্টর এবং অ্যাসাইনমেন্ট অপারেটর ইমো লিখতে খুব কষ্ট হবে।
রোজিনা

উত্তর:


70

উত্তরটি নিয়ে আমিও কিছুটা কৌতূহলী।

সবচেয়ে সন্তোষজনক উত্তরটি আমি আর একটি পোস্টে আর্টেমিক্স থেকে পেয়েছি (আমি ব্যক্তি শ্রেণীর সাথে AClass নামকরণ করছি): কেন বস্তু-স্তরের পরিবর্তে শ্রেণি-স্তরের অ্যাক্সেস পরিবর্তনকারী রয়েছে?

ব্যক্তিগত পরিবর্তনকারী এনক্যাপসুলেশন নীতিটি প্রয়োগ করে।

ধারণাটি হ'ল 'বাহ্যিক বিশ্বের' ব্যক্তির অভ্যন্তরীণ প্রক্রিয়াগুলিতে পরিবর্তন করা উচিত নয় কারণ ব্যক্তির বাস্তবায়ন সময়ের সাথে সাথে পরিবর্তিত হতে পারে (এবং বাস্তবায়নের পার্থক্যগুলি সমাধান করতে আপনাকে পুরো বাইরের জগতটি পরিবর্তন করতে হবে - যা প্রায় অসম্ভব)।

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

সম্পাদনা: দয়া করে ভোট Artemix 'উত্তর। আমি কেবল এটির অনুলিপি-আটকানো করছি।


4
সম্ভবত এটিই কারণ। তবে এটি একটি খারাপ ধারণা । এটি খারাপ অনুশীলনকে উত্সাহ দেয়। কোনও বিকাশকারী কোনও Personশ্রেণীর ক্ষেত্রে একটি ক্ষেত্র অ্যাক্সেস Personকরে পুরো ক্লাসের বাস্তবায়ন জানতে হবে না। অ্যাক্সেসর কী অপারেশন করে তা জেনেও অ্যাক্সেসর ব্যবহার করা ভাল অভ্যাস।
নিকোলাস বারবুলেসকো

16
@ নিকোলাস বারবুলেসকো আমি মনে করি যে উত্তরের উত্তরটি যথাযথ। উদাহরণস্বরূপ বলুন যে আপনি equals(Object)জাভা শ্রেণিতে Personঅন্য কোনও উদাহরণের সাথে কোনও সামগ্রীর সাম্যতা পরীক্ষা করতে পদ্ধতিটি প্রয়োগ করতে চান Person। আপনি উভয় দৃষ্টান্ত সমান কিনা তা পরীক্ষা করতে আপনি বাইরের বিশ্বকে সক্ষম করতে চাইতে পারেন, তবে আপনি পাবলিক অ্যাক্সেসর পদ্ধতি ব্যবহার করে বাইরের বিশ্বে সাম্যতা যাচাইয়ের জন্য প্রয়োজনীয় শ্রেণীর ব্যক্তিগত ক্ষেত্রগুলির সমস্ত প্রকাশ করতে চাইবেন না। privateক্ষেত্রগুলিতে শ্রেণিক স্তরের অ্যাক্সেস থাকা এই জাতীয় পাবলিক পদ্ধতিগুলি বাস্তবায়নের প্ররোচিত প্রয়োজনীয়তা ছাড়াই এই জাতীয় পদ্ধতি বাস্তবায়নে সক্ষম করে।
মাল্টে স্কোরুপা,

4
@ মাল্টসকোরুপা - এটি একটি ভাল উদাহরণ (পদ্ধতিটি বাস্তবায়ন করে equals)।
নিকোলাস বারবুলেসকো

@ মাল্টসকোরুপা - তবে, পদ্ধতিটি বাস্তবায়নের জন্য equalsবেসরকারী অ্যাক্সেসরদের কল করে কাজ করা যেতে পারে।
নিকোলাস বারবুলেসকো

@ নিকোলাস বারবুলেসকো হ্যাঁ অবশ্যই, তবে মূল বিষয়টি হল, আপনি পদ্ধতিটি বাস্তবায়নের জন্য প্রাইভেট অ্যাক্সেসর ব্যবহার করেন বা সরাসরি ব্যক্তিগত ক্ষেত্রে অ্যাক্সেস করেন না কেন, privateশ্রেণি-স্তরের অ্যাক্সেস দিতে হবে। আমি সম্মত হই যে অ্যাকসেসরগুলি ব্যবহার করা সাধারণত একটি ভাল অভ্যাস, যদিও এই ক্ষেত্রে এটি বেশিরভাগ ক্ষেত্রে প্রসঙ্গ এবং ব্যক্তিগত স্টাইলের বিষয়। নোট করুন যে কার্যকরী জাভায় জোশুয়া ব্লচ (আইটেম 8) এবং ড ডবস নিবন্ধের তাল কোহেন উভয়ই কীভাবে প্রয়োগ করতে হয় সে সম্পর্কে আলোচনা করার সময় তাদের কোড তালিকাগুলিতে সরাসরি ব্যক্তিগত ক্ষেত্রগুলিতে অ্যাক্সেস করে equals
মাল্টে স্কারুপ্পা

17

দেখুন জাভা ল্যাঙ্গুএজ স্পেসিফিকেশন, অনুচ্ছেদ 6.6.1। অ্যাক্সেসিবিলিটি নির্ধারণ করা হচ্ছে

এটা বলে

অন্যথায়, যদি সদস্য বা কনস্ট্রাক্টর ঘোষণা করা হয় private, তবে কেবলমাত্র যদি শীর্ষ স্তরের শ্রেণীর (§7.6) সদস্য বা কনস্ট্রাক্টরের ঘোষণাকে ঘিরে থাকে তবে কেবলমাত্র এটির অনুমতি দেওয়া হয়।

আরও তথ্যের জন্য উপরের লিঙ্কটি ক্লিক করুন। সুতরাং উত্তরটি হ'ল: কারণ জেমস গোসলিং এবং জাভার অন্যান্য লেখকগণ এটিকে সেভাবেই স্থির করেছিলেন।


17

ভাল প্রশ্ন. দেখে মনে হচ্ছে অবজেক্ট লেভেলের অ্যাক্সেস মডিফায়ার এনক্যাপসুলেশন নীতিটি আরও কার্যকর করবে।

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

সুতরাং এনক্যাপসুলেশনের অর্থ পৃথিবীর বাকী সমস্ত অঞ্চলে বন্ধ থাকা নয়। এর অর্থ আপনি কার জন্য উন্মুক্ত থাকতে চান তা সম্পর্কে বাছাই করা।


4
এই উত্তরটি ভোট দেওয়া দরকার! অন্যান্য উত্তরগুলি কেবলমাত্র 'বিধি'-কে পুনরায় জানায় তবে কেবলমাত্র এটিই নিয়মের পিছনে কারণটি উন্মোচন করে এবং বিন্দুটিকে আঘাত করে।
মোজোজ

4
তবে কি কোনও কপিরাইট সরবরাহ করার জন্য কোনও বিষয় দায়বদ্ধ হওয়ার চেয়ে ভাল হবে না? তারপরে, আপনার যদি কোনও জিনিসের গভীর অনুলিপি প্রয়োজন হয় তবে আপনি একই শ্রেণির অন্য একটি বিষয় বা ভিন্ন শ্রেণীর কোনও বিষয় হ'ল এটি গুরুত্বপূর্ণ নয়: এটি একই প্রক্রিয়া, o.deepCopy()বা যাই হোক না কেন।
ডারসাইড

4

এটি কাজ করে কারণ আপনি আছেন class Person- একটি শ্রেণিকে তার নিজের শ্রেণীর ভিতরে ঝাঁকুনির অনুমতি দেওয়া হয়। আপনি যখন অনুলিপি নির্মাণকারী লিখতে চান এটি সত্যই সহায়তা করে:

class A
{
   private:
      int x;
      int y;
   public:
      A(int a, int b) x(a), y(b) {}
      A(A a) { x = a.x; y = y.x; }
};

অথবা যদি আমরা লিখতে চাই operator+এবং operator-আমাদের বড় সংখ্যার ক্লাসের জন্য।


এটি নির্ভরতা ইঞ্জেকশনের অনুরূপ something যার মধ্যে আপনি অন্য কোনও শ্রেণীর অবজেক্টও ইনজেক্ট করতে পারেন, যেখানে আপনি ব্যক্তিগত ভেরিয়েবলটি অ্যাক্সেস করতে পারবেন না।
নাগেস্বরান

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

জাভা এবং .নেটে বন্ধুর ধারণা নেই। এরকম ক্ষেত্রে কীভাবে এটি পরিচালনা করবেন?
নাগেস্বরান

1

জাভাতে প্রাইভেট দৃশ্যমানতার শব্দার্থবিজ্ঞান কেন বস্তুর স্তরের পরিবর্তে শ্রেণি স্তর of প্রশ্নে আমার 2 সেন্ট।

আমি বলব যে সুবিধাটি এখানে মূল চাবিকাঠি বলে মনে হচ্ছে। প্রকৃতপক্ষে, অবজেক্ট স্তরের একটি ব্যক্তিগত দৃশ্যমানতা ওপি দ্বারা চিত্রিত দৃশ্যে অন্যান্য ক্লাসগুলিতে (যেমন একই প্যাকেজটিতে) পদ্ধতিগুলি প্রকাশ করতে বাধ্য করেছিল।

বস্তুতঃ ব্যক্তিগত বা স্তরের দৃশ্যমানতার তুলনায় শ্রেণি-বেসরকারী স্তরে (যেমন জাভা দেওয়া) দৃশ্যমানতা যে কোনও সমস্যা তৈরি করে এমন কোনও উদাহরণ আমি খুঁজে পাচ্ছিলাম না বা খুঁজেও পাচ্ছিলাম না।

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

উদাহরণস্বরূপ আইফেল , বেছে বেছে রফতানি সরবরাহ করে: আপনি any NONE} (অবজেক্ট-প্রাইভেট) থেকে {কোনও} (জনসাধারণের সমতুল্য, এবং ডিফল্টও) থেকে {ব্যক্তি to তে আপনার পছন্দের যে কোনও শ্রেণীর যে কোনও শ্রেণীর বৈশিষ্ট্য রফতানি করতে পারবেন (শ্রেণি-বেসরকারী, ওপির উদাহরণ দেখুন), শ্রেণিগুলির নির্দিষ্ট গোষ্ঠীগুলিতে {পার্সোন, ব্যাংক}

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

অবশ্যই আপনাকে একটি অ্যাট্রিবিউট সেট করতে এখনও একটি সেটার প্রয়োজন, তবে আপনি সেই বৈশিষ্ট্যের জন্য "অ্যাসাইনার" হিসাবে সংজ্ঞায়িত করে এটি আড়াল করতে পারেন। এটি আপনাকে, যদি আপনি চান, সেটার অনুরোধের পরিবর্তে আরও বেশি সুবিধাজনক অ্যাসাইনমেন্ট অপারেটর ব্যবহার করার অনুমতি দেয়।


0

কারণ private অ্যাক্সেস মডিফায়ার এটিকে কেবল শ্রেণীর মধ্যে দৃশ্যমান করে দেয় । এই পদ্ধতিটি এখনও ক্লাসে রয়েছে


আমার প্রশ্ন হ'ল কেন এটি "শ্রেণীর মধ্যে" যেমন তৈরি করা হয়েছে তবে কেন "কেবলমাত্র বস্তুর মধ্যে" পছন্দ হচ্ছে না?
নাগেস্বরান

কারণ এভাবেই জাভা তৈরি হয়।
দারিজন

আর জাভা কেন এমন তৈরি করল জাভা?
নাগেস্বরান

জাভা এটি তৈরি করেনি, জাভা নির্মাতারা করেছিলেন। কেন? কারণ তারা রক!
দারিজন

4
জাভা নির্মাতারা কোনও কারণ ছাড়াই এটি করবে না, এবং এটি করার কিছু কারণ থাকতে হবে; আমি কারণটি জিজ্ঞাসা করছি
নাগেস্বরান

0

privateক্ষেত্র বর্গ / বস্তু যা ক্ষেত্র ঘোষিত হয় এ প্রবেশযোগ্য। এটি যে শ্রেণীতে রয়েছে তার বাইরে অন্য শ্রেণি / অবজেক্টের কাছে এটি ব্যক্তিগত।


-1

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


-2

জাভাতে প্রতিবিম্ব ধারণার সাথে ক্ষেত্র এবং পদ্ধতিগুলি গোপনীয় করা সম্ভব

মোদিফ্যান্ডো মেটাডোস ওয়াই ক্যাম্পোস প্রাইভেটোস কন জাভায় রিফ্লেকসিওন


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