সি # কেন সি ++ স্টাইলের 'বন্ধু' কীওয়ার্ডটি সরবরাহ করে না? [বন্ধ]


208

সি ++ বন্ধু শব্দ একটি পারবেন class Aমনোনীত করতে class Bতার বন্ধু হিসেবে। এটি Class Bএর private/ protectedসদস্যদের অ্যাক্সেস করতে দেয় class A

এটিকে কেন সি # (এবং ভিবি.এনইটি) থেকে বাদ দেওয়া হয়েছিল আমি কখনও কিছুই পড়িনি। পূর্ববর্তী স্ট্যাকওভারফ্লো প্রশ্নের বেশিরভাগ উত্তর বলে মনে হচ্ছে এটি সি ++ এর একটি দরকারী অংশ এবং এটি ব্যবহার করার উপযুক্ত কারণ রয়েছে। আমার অভিজ্ঞতায় আমাকে একমত হতে হবে

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

মূল ডিজাইন প্যাটার্নস বইটি এর উদাহরণগুলির মধ্যে এটি নিয়মিত ব্যবহার করে।

সুতরাং সংক্ষেপে, কেন friendসি # থেকে অনুপস্থিত, এবং এটি সি # তে অনুকরণের "সেরা অনুশীলন" উপায় (বা উপায়গুলি) কী?

(উপায় দ্বারা, internalশব্দ হয় না একই জিনিস, এটা পারবেন সব সমগ্র মধ্যে ক্লাস সমাবেশ অ্যাক্সেস করতে internalসদস্য, যখন friendআপনি একটি নির্দিষ্ট শ্রেণী দিতে পারবেন সম্পূর্ণ অ্যাক্সেসের জন্য ঠিক একটি অন্য বর্গ)


5
আমি মনে করি সুরক্ষিত অভ্যন্তরীণ একটি ভাল আপস ..
গুলজার নাজিম

3
এটা খুব বিভ্রান্তিকর নয় তাই না? যেমন আমি উপরে বলেছি জিওএফ বইটি উদাহরণগুলিতে এটি প্রায়শই ব্যবহার করে। আমার কাছে এটি তখন আর বিভ্রান্তিকর নয় তবে অভ্যন্তরীণ।
অ্যাশ

7
আমি অবশ্যই দৃশ্যাবলীগুলি দেখতে পাচ্ছি যেখানে তারা খুব কার্যকর হতে পারে, যেমন ইতিমধ্যে ইউনিট পরীক্ষার উল্লেখ করা হয়েছে। তবে আপনি কি সত্যিই চান যে আপনার বন্ধুরা আপনার ব্যক্তিগতকৃতদের অ্যাক্সেস করতে পারে?
দানসওয়াইন

2
এর উত্তর দেওয়া সহজ: সি # অ্যাক্সেস মডিফায়ার হিসাবে "অভ্যন্তরীণ" প্রস্তাব করে যা একই মডিউল / সমাবেশের সমস্ত কোডে অ্যাক্সেস দেয়। এটি বন্ধুর মতো কোনও কিছুর প্রয়োজন সরিয়ে দেয়। জাভাতে মূল শব্দটি "সুরক্ষিত" একই প্যাকেজ থেকে একইভাবে অ্যাক্সেস সরবরাহ করতে পারে।
বিক্রয়বিটজে

2
@ সেলিবিটজে, আমি প্রশ্নের অভ্যন্তরের সাথে পার্থক্যগুলি উল্লেখ করেছি। ইন্ট্রানেলের সমস্যা হ'ল সমাবেশের সমস্ত শ্রেণি অভ্যন্তরীণ সদস্যদের অ্যাক্সেস করতে পারে। এই এনক্যাপসুলেশনটি বিরতি দেয় কারণ এই শ্রেণীর অনেকগুলি অ্যাক্সেসের প্রয়োজন হতে পারে না।
অ্যাশ

উত্তর:


67

প্রোগ্রামিংয়ে বন্ধুবান্ধবকে কম-বেশি বিবেচনা করা হয় "নোংরা" এবং অপব্যবহার করা সহজ। এটি শ্রেণীর মধ্যে সম্পর্ককে ভেঙে দেয় এবং একটি ওও ভাষার কিছু মৌলিক বৈশিষ্ট্যগুলিকে হ্রাস করে।

বলা হচ্ছে, এটি একটি দুর্দান্ত বৈশিষ্ট্য এবং আমি এটি অনেক সময় সি ++ এ ব্যবহার করেছি; এবং এটি সি # তেও ব্যবহার করতে চাই। তবে আমি সি # এর "খাঁটি" ওওনেস (সি ++ এর সিউডো ওওনেসের তুলনায়) এমএসের সিদ্ধান্ত নিয়েছি যে জাভাতে কোনও বন্ধু কীওয়ার্ড সি # না হওয়া উচিত (কেবল মজা করা;))

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

সম্পাদনা করুন আমি কী কীভাবে বন্ধু কীওয়ার্ডটি ওওপিকে হ্রাস করে তা স্পষ্ট করে বলি।

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


167
সি # 'অভ্যন্তরীণ' আসলে সি ++ 'বন্ধু' এর চেয়ে অনেক বেশি এনক্যাপসুলেশনকে আঘাত করছে। "বন্ধুত্ব" দিয়ে, মালিক যাকে চাইবে স্পষ্টভাবে অনুমতি দেয়। "অভ্যন্তরীণ" একটি মুক্ত সমাপ্ত ধারণা।
নেমানজা ত্রিফুনোভিচ

21
তিনি যে বৈশিষ্ট্যগুলি অন্তর্ভুক্ত করেছিলেন সেগুলি না রেখে তিনি যে বৈশিষ্ট্যগুলি রেখে গেছেন তার জন্য আন্ডারদের প্রশংসা করা উচিত।
মেহরদাদ আফশারি

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

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

8
আমি বেশ বিপরীত মনে করি। যদি কোনও অ্যাসেমব্লির 50 টি ক্লাস থাকে, যদি 3 টি শ্রেণির মধ্যে কিছুটি ইউটিলিটি শ্রেণি ব্যবহার করে, তবে আজ, আপনার একমাত্র বিকল্পটি সেই ইউটিলিটি শ্রেণিকে "অভ্যন্তরীণ" হিসাবে চিহ্নিত করবে। এটি করার মাধ্যমে, আপনি এটি কেবলমাত্র 3 ক্লাসে ব্যবহারের জন্য উপলব্ধ করেননি, তবে সমাবেশে থাকা ক্লাসগুলির জন্যও। আপনি যদি কেবল যা করতে চান তা হ'ল সূক্ষ্ম দানযুক্ত অ্যাক্সেস সরবরাহ করা উচিত যে প্রশ্নে কেবল তিনটি শ্রেণীরই ইউটিলিটি ক্লাসে অ্যাক্সেস ছিল। এটি আসলে এটিকে আরও অবজেক্ট ওরিয়েন্টেড করে তোলে কারণ এটি এনক্যাপসুলেশনকে উন্নত করে।
zumalifeguard

104

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

দেখুন কনরাড রুডলফ এর বার্তা অন্যান্য থ্রেড, অথবা যদি আপনি পছন্দ দেখতে প্রাসঙ্গিক এন্ট্রি সি ++ প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী হবে।


... এবং এফকিউএতে সংশ্লিষ্ট এন্ট্রি: yosefk.com/c++fqa/friend.html#fqa-14.2
জোশ লি

28
+1 এর জন্য " বন্ধু ব্যবহার করা এনক্যাপসুলেশন লঙ্ঘন করার কথা নয়, বরং এটি প্রয়োগ করার বিষয়ে "
নওয়াজ

2
অভিমত মতামত একটি বিষয় আমি মনে করি; এবং সম্ভবত প্রশ্নের সঠিক পরিস্থিতির সাথে সম্পর্কিত। একটি শ্রেণি তৈরি করা friendএটিকে আপনার সমস্ত ব্যক্তিগত সদস্যদের অ্যাক্সেস দেয়, এমনকি যদি কেবলমাত্র এটির মধ্যে একটি নির্ধারণ করতে দেওয়া হয়। এমন দৃ argument় যুক্তি রয়েছে যে অন্য শ্রেণীর জন্য ক্ষেত্রগুলি উপলব্ধ করা যা তাদের প্রয়োজন হয় না তাকে "এনক্যাপসুলেশন লঙ্ঘন" বলে গণ্য করা হয়। সি ++ তে এমন জায়গা রয়েছে যেখানে এটি প্রয়োজনীয় (ওভারলোডিং অপারেটর), তবে একটি এনক্যাপসুলেশন ট্রেডঅফ রয়েছে যা সাবধানতার সাথে বিবেচনা করা দরকার। দেখে মনে হচ্ছে সি # ডিজাইনাররা মনে করেছিলেন যে ট্রেড অফের পক্ষে এটি উপযুক্ত নয়।
গ্র্যান্ডওপেনার

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

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

50

তথ্যের জন্য .NET- তে অন্য সম্পর্কিত কিছু নয় তবে একই জিনিসটি [InternalsVisibleTo]যা কোনও অ্যাসেম্বলিকে অন্য একটি সংসদকে মনোনীত করতে দেয় (যেমন ইউনিট পরীক্ষার সমাবেশ) যা কার্যকরভাবে ক্ষেত্রে / সদস্যদের "অভ্যন্তরীণ" অ্যাক্সেস পায় মূল সমাবেশ।


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

14

সি # তে ইন্টারফেস ব্যবহার করে "বন্ধু" সি ++ এর জন্য ব্যবহার করা হয় সেই একই ধরণের জিনিসগুলি আপনি সফল করতে সক্ষম হবেন। এটির জন্য আপনাকে অবশ্যই পরিষ্কারভাবে সংজ্ঞায়িত করতে হবে যে দুটি সদস্যের মধ্যে কোন সদস্য পাস হচ্ছে, এটি অতিরিক্ত কাজ তবে কোডটি বোঝা আরও সহজ করে তুলতে পারে।

কারও কাছে যদি "বন্ধু" এর যুক্তিসঙ্গত ব্যবহারের উদাহরণ থাকে যা ইন্টারফেস ব্যবহার করে অনুকরণ করা যায় না, দয়া করে এটি ভাগ করুন! আমি সি ++ এবং সি # এর মধ্যে পার্থক্যগুলি আরও ভালভাবে বুঝতে চাই।


ভাল যুক্তি. আপনি কি পূর্ববর্তী এসও প্রশ্নটি দেখার মনোযোগ পেয়েছিলেন (মনোক্সাইড জিজ্ঞাসা করেছিলেন এবং উপরে লিঙ্ক করেছেন? আমি সি # এ কীভাবে সমাধান করতে পারি তার মধ্যে আমি আগ্রহী?
অ্যাশ

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

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

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

1
এখানে একটি: স্ট্যাকওভারফ্লো / প্রশ্ন / 5921612/… আমি সি ++ পটভূমি থেকে আসার সাথে সাথে বন্ধুর অভাব আমাকে প্রায় পাগল করে তোলে। সি # এর সাথে আমার কয়েক বছরে আমি আক্ষরিকভাবে কয়েকশ পদ্ধতিতে জনসাধারণকে প্রকাশ করেছি যেখানে সেগুলি তার পরিবর্তে ব্যক্তিগত এবং নিরাপদ হতে পারে, সবগুলি বন্ধুর অভাবে। ব্যক্তিগতভাবে আমি মনে করি বন্ধু হ'ল সবচেয়ে গুরুত্বপূর্ণ বিষয় যা।
নেট- এ

14

সঙ্গে friendএকটি সি ++ ডিজাইনার যাদের ব্যক্তিগত * সদস্যদের উন্মুক্ত উপর সুনির্দিষ্ট নিয়ন্ত্রণ আছে। কিন্তু, তিনি প্রাইভেট সদস্যদের প্রত্যেককেই প্রকাশ করতে বাধ্য করেছেন।

সঙ্গে internalএকটি সি # ডিজাইনার ব্যক্তিগত সদস্যদের তিনি প্রকাশক এর সেট উপর সুনির্দিষ্ট নিয়ন্ত্রণ আছে। স্পষ্টতই, তিনি কেবলমাত্র একক ব্যক্তিগত সদস্যকে প্রকাশ করতে পারেন। তবে, এটি বিধানসভায় সমস্ত শ্রেণীর কাছে প্রকাশিত হবে।

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

আপনি দেখতে পাচ্ছেন, আমাদের 2 টি মাত্রা রয়েছে যার সাথে এনক্যাপসুলেশন লঙ্ঘন করা যায়। friendএটি একটি মাত্রার সাথে লঙ্ঘন করে, internalএটি অন্য সাথে করে। এনক্যাপসুলেশন ধারণায় কোনটি খারাপ লঙ্ঘন? বলা কঠিন. তবে এটি উভয়ই উপলব্ধ friendএবং internalউপলভ্য হবে। তদ্ব্যতীত, এই দুটিতে একটি ভাল সংযোজন হবে তৃতীয় প্রকারের কীওয়ার্ড, যা সদস্য-দ্বারা-ভিত্তিতে (যেমন internal) ব্যবহৃত হবে এবং লক্ষ্য শ্রেণি (যেমন friend) নির্দিষ্ট করে ।

* ব্রিভিটির জন্য আমি "ব্যক্তিগত এবং / বা সুরক্ষিত" এর পরিবর্তে "ব্যক্তিগত" ব্যবহার করব।

- নিক


13

আসলে, সি # বিশেষ শব্দ ছাড়া খাঁটি ওওপি পদ্ধতিতে একই আচরণ পাওয়ার সম্ভাবনা দেয় - এটি ব্যক্তিগত ইন্টারফেস।

যতদূর প্রশ্ন সি # বন্ধুর সমতুল্য কী? এই নিবন্ধটির সদৃশ হিসাবে চিহ্নিত করা হয়েছিল এবং সেখানে কেউই সত্যিই ভাল উপলব্ধির প্রস্তাব দেয় না - আমি এখানে উভয় প্রশ্নের উত্তর দেখাব here

মূল ধারণাটি এখান থেকে নিচ্ছিল: একটি ব্যক্তিগত ইন্টারফেস কী?

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

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

আপনি করতে পারেন:

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

Controller.cs

public class Controller
{
    private interface IState
    {
        void Update();
    }

    public class StateBase : IState
    {
        void IState.Update() {  }
    }

    public Controller()
    {
        //it's only way call Update is to cast obj to IState
        IState obj = new StateBase();
        obj.Update();
    }
}

Program.cs

class Program
{
    static void Main(string[] args)
    {
        //it's impossible to write Controller.IState p = new Controller.StateBase();
        //Controller.IState is hidden
        var p = new Controller.StateBase();
        //p.Update(); //is not accessible
    }
}

আচ্ছা, উত্তরাধিকার সম্পর্কে কি?

আমাদের বর্ণিত কৌশলটি ব্যবহার করা দরকার যেহেতু সুস্পষ্ট ইন্টারফেস সদস্যের বাস্তবায়নগুলি ভার্চুয়াল হিসাবে ঘোষণা করা যায় না এবং আইসেটকে চিহ্নিত করে কন্ট্রোলার থেকেও প্রাপ্তির সম্ভাবনা দিতে পারে।

Controller.cs

public class Controller
{
    protected interface IState
    {
        void Update();
    }

    public class StateBase : IState
    {
        void IState.Update() { OnUpdate(); }
        protected virtual void OnUpdate()
        {
            Console.WriteLine("StateBase.OnUpdate()");
        }
    }

    public Controller()
    {
        IState obj = new PlayerIdleState();
        obj.Update();
    }
}

PlayerIdleState.cs

public class PlayerIdleState: Controller.StateBase
{
    protected override void OnUpdate()
    {
        base.OnUpdate();
        Console.WriteLine("PlayerIdleState.OnUpdate()");
    }
}

এবং পরিশেষে উদাহরণস্বরূপ কীভাবে ক্লাস কন্ট্রোলার নিক্ষিপ্ত উত্তরাধিকার পরীক্ষা করা যায়: কন্ট্রোলার টেস্ট.সি

class ControllerTest: Controller
{
    public ControllerTest()
    {
        IState testObj = new PlayerIdleState();
        testObj.Update();
    }
}

আশা করি আমি সমস্ত মামলা কভার করব এবং আমার উত্তরটি কার্যকর ছিল।


এটি একটি দুর্দান্ত উত্তর যার আরও বেশি মূল্যায়ন প্রয়োজন।
KthProg

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

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

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

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

9

ইউনিট পরীক্ষা লেখার সময় বন্ধুটি অত্যন্ত দরকারী।

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

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


আমি "বন্ধু" কারখানার ক্লাসগুলির জন্য দরকারী সম্পর্কে একটি মন্তব্য করতে যাচ্ছিলাম, তবে আমি ইতিমধ্যে কেউ এটি তৈরি করেছে তা দেখে আনন্দিত।
এডওয়ার্ড রবার্টসন

9

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

"বন্ধু ক্লাসগুলি খারাপ" বলা অন্যান্য অযোগ্য বিবৃতি যেমন "গোটোস ব্যবহার করবেন না" বা "লিনাক্স উইন্ডোজের চেয়ে ভাল" এর মতোই স্বল্পদৃষ্টিযুক্ত।

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


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

1
@ অ্যাডওয়ার্ড রবার্টসন নির্ধারক ধ্বংসের কোনও সময় নেই, যদি না কোনও ডেস্ট্রাক্টর সংজ্ঞায়িত হয়। তবে এই ক্ষেত্রে, আবর্জনা সংগ্রহ আরও খারাপ, কারণ তারপরে আপনাকে একটি ফাইনালাইজার ব্যবহার করা উচিত, যা ধীর এবং অবিচ্ছিন্ন is
ক্যালাস

1
... এবং মেমরি একমাত্র সম্পদ নয়। লোকেরা প্রায়শই এমন আচরণ করে যেন এটি সত্য।
cubspl42

8

আপনি সি # কীওয়ার্ড "অভ্যন্তরীণ" দিয়ে সি ++ "বন্ধু" এর কাছাকাছি যেতে পারেন ।


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

3
@ আশ: আপনার এটির অভ্যস্ত হওয়া দরকার তবে একবার আপনি যখন আপনার অ্যাপ্লিকেশনগুলির মৌলিক বিল্ডিং ব্লক হিসাবে সমাবেশগুলি দেখেন, তখন এটি internalআরও বেশি অর্থবোধ করে এবং এনক্যাপসুলেশন এবং ইউটিলিটির মধ্যে একটি দুর্দান্ত বাণিজ্য বন্ধ করে দেয়। যদিও জাভার ডিফল্ট অ্যাক্সেস আরও ভাল।
কনরাড রুডল্ফ

7

এটি আসলে সি # তে কোনও সমস্যা নয়। আইএল এটি একটি মৌলিক সীমাবদ্ধতা। সি # এটি দ্বারা সীমাবদ্ধ, অন্য কোনও মত। নেট ভাষা যাচাইযোগ্য হতে চায়। এই সীমাবদ্ধতায় সি ++ / সিএলআই ( স্পেস বিভাগ 20.5 ) এ সংজ্ঞায়িত পরিচালিত ক্লাসগুলিও অন্তর্ভুক্ত রয়েছে ।

এটি বলা হচ্ছে আমি মনে করি যে এটি কেন খারাপ জিনিস তা সম্পর্কে নেলসনের একটি ভাল ব্যাখ্যা রয়েছে।


7
-1। friendখারাপ জিনিস নয়; বিপরীতে, এটি তুলনায় অনেক ভাল internal। এবং নেলসনের ব্যাখ্যাটি খারাপ এবং ভুল।
নওয়াজ

4

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

এটি কি এনক্যাপসুলেশন দৃষ্টান্ত প্রয়োগ করতে হবে? সুতরাং আপনি অ্যাক্সেসর পদ্ধতি লিখতে হবে এবং এখন কি? আপনারা কীভাবে সকলকে (বি শ্রেণির পদ্ধতি বাদে) এই পদ্ধতিগুলি কল করা থেকে বিরত করবেন? আপনি পারবেন না, কারণ "বন্ধু" হারিয়ে যাওয়ার কারণে আপনি এটি নিয়ন্ত্রণও করতে পারবেন না।

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


সি # তে আপনি বেশিরভাগ অপারেটরকে ওভারলোড করতে পারেন। আপনি নিয়োগ অপারেটার জমিদার পারবেন না, কিন্তু অন্যদিকে আপনি ওভাররাইড করতে পারে ||/ &&যখন সেগুলিকে সংক্ষিপ্ত circuiting রাখা। ডিফল্ট প্যারামিটারগুলি সি # 4 এ যুক্ত করা হয়েছিল
কোডসইনচাউস

2

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

এটি সমাবেশ পর্যায়ে কাজ করে তবে এটি এমন কাজ করে যেখানে অভ্যন্তরীণ নয়; এটি হ'ল যেখানে আপনি কোনও সমাবেশ বিতরণ করতে চান তবে চান যে অন্য কোনও বিতরণ করা অ্যাসেমব্লিকে এটিতে সুবিধামত অ্যাক্সেস দেওয়া হোক।

আপনার সুরক্ষিত অ্যাসেম্বলির পাশাপাশি কেউ প্রতারক বন্ধু তৈরি করতে এড়াতে তাদের বন্ধুত্বপূর্ণ সমাবেশটি শক্তিশালী হওয়া দরকার right


2

আমি "বন্ধু" কীওয়ার্ড সম্পর্কে অনেক স্মার্ট মন্তব্য পড়েছি এবং এটি কী দরকারী জিনিস তা আমি সম্মত করি তবে আমি মনে করি কোন "অভ্যন্তরীণ" কীওয়ার্ডটি কম দরকারী, এবং তারা উভয় এখনও খাঁটি ওও প্রোগ্রামিংয়ের জন্য খারাপ।

আমাদের কী আছে? ("বন্ধু" সম্পর্কে বলছি আমি "অভ্যন্তরীণ" সম্পর্কেও বলছি)

  • "বন্ধু" ব্যবহার করে oo সম্পর্কিত কোডটি কি কম শুদ্ধ হয়?
  • হ্যাঁ;

  • "বন্ধু" ব্যবহার করে কি কোড আরও ভাল হয় না?

  • না, আমাদের এখনও ক্লাসগুলির মধ্যে কিছু ব্যক্তিগত সম্পর্ক তৈরি করা দরকার, এবং আমরা কেবল তখনই এটি করতে পারি যদি আমরা আমাদের সুন্দর এনক্যাপসুলেশনটি ভেঙে ফেলি, তবে এটিও ভাল নয়, "বন্ধু" ব্যবহারের চেয়ে আরও খারাপ এটি আমি বলতে পারি।

বন্ধু ব্যবহার করা কিছু স্থানীয় সমস্যা তৈরি করে, এটি ব্যবহার না করা কোড-গ্রন্থাগার-ব্যবহারকারীদের জন্য সমস্যা তৈরি করে।

প্রোগ্রামিং ভাষার জন্য সাধারণ ভাল সমাধান আমি এটি দেখতে চাই:

// c++ style
class Foo {
  public_for Bar:
    void addBar(Bar *bar) { }
  public:
  private:
  protected:
};

// c#
class Foo {
    public_for Bar void addBar(Bar bar) { }
}

আপনি এটি সম্পর্কে কি মনে করেন? আমি মনে করি এটি সর্বাধিক সাধারণ এবং খাঁটি অবজেক্ট-ভিত্তিক সমাধান। আপনি যে কোনও ক্লাসে আপনার পছন্দ মতো যে কোনও পদ্ধতি অ্যাক্সেস খুলতে পারেন।


আমি কোনও ওওপি সেন্ডিনেল নই, তবে দেখে মনে হচ্ছে এটি বন্ধু এবং অভ্যন্তরীণ বিরুদ্ধে সকলের হাতের মুঠোয় সমাধান করে। তবে আমি সি # এর সিনট্যাক্সের প্রসার এড়াতে একটি অ্যাট্রিবিউট ব্যবহার করার পরামর্শ দেব: [পাবলিকফোর্ড বার] অকার্যকর অ্যাডবার (বার বার)}} ... আমি নিশ্চিত না যে এটি বোধগম্য; আমি জানি না কীভাবে অ্যাট্রিবিউটগুলি কাজ করে বা তারা অ্যাক্সেসযোগ্যতার সাথে ঝাঁকুনি দিতে পারে কিনা (তারা প্রচুর অন্যান্য "জাদুকরী" স্টাফ করে)।
গ্রাট

2

আমি কেবল "কিভাবে" প্রশ্নের উত্তর দেব।

এখানে অনেক উত্তর রয়েছে, তবে আমি এই বৈশিষ্ট্যটি অর্জন করতে "ধরণের নকশার ধরণ" প্রস্তাব করতে চাই। আমি সহজ ভাষা পদ্ধতি ব্যবহার করব, যার মধ্যে রয়েছে:

  • ইন্টারফেস
  • নেস্টেড ক্লাস

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

public interface IStudentFriend
{
    Student Stu { get; set; }
    double GetGPS();
}

public class Student
{
    // this is private member that I expose to friend only
    double GPS { get; set; }
    public string Name { get; set; }

    PrivateData privateData;

    public Student(string name, double gps) => (GPS, Name, privateData) = (gps, name, new PrivateData(this);

    // No one can instantiate this class, but Student
    // Calling it is possible via the IStudentFriend interface
    class PrivateData : IStudentFriend
    {
        public Student Stu { get; set; }

        public PrivateData(Student stu) => Stu = stu;
        public double GetGPS() => Stu.GPS;
    }

    // This is how I "mark" who is Students "friend"
    public void RegisterFriend(University friend) => friend.Register(privateData);
}

public class University
{
    var studentsFriends = new List<IStudentFriend>();

    public void Register(IStudentFriend friendMethod) => studentsFriends.Add(friendMethod);

    public void PrintAllStudentsGPS()
    {
        foreach (var stu in studentsFriends)
            Console.WriteLine($"{stu.Stu.Name}: stu.GetGPS()");
    }
}

public static void Main(string[] args)
{
    var Technion = new University();
    var Alex     = new Student("Alex", 98);
    var Jo       = new Student("Jo", 91);

    Alex.RegisterFriend(Technion);
    Jo.RegisterFriend(Technion);
    Technion.PrintAllStudentsGPS();

    Console.ReadLine();
}

1

আমি সন্দেহ করি এর সি # সংকলন মডেলটির সাথে কিছু করার আছে - রানটাইম সময়ে জেআইটি সংকলন করে আইএল তৈরি করছে। অর্থাত: সি # জেনেরিকগুলি সি ++ জেনেরিকের সাথে মৌলিকভাবে আলাদা are


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

1

আপনি এটিকে ব্যক্তিগত রাখতে পারেন এবং ফাংশনগুলিতে কল করতে প্রতিবিম্বটি ব্যবহার করতে পারেন। পরীক্ষার কাঠামোটি এটি করতে পারে যদি আপনি এটি কোনও ব্যক্তিগত ফাংশন পরীক্ষা করতে বলেন to


আপনি যদি সিলভারলাইট অ্যাপ্লিকেশনটিতে কাজ না করেন তবে।
ক্যালাস

1

আমি নিয়মিত বন্ধুকে ব্যবহার করতাম এবং আমি মনে করি না এটি কোনও ওওপি লঙ্ঘন বা কোনও ডিজাইনের ত্রুটির চিহ্ন sign বেশ কয়েকটি জায়গা রয়েছে যেখানে নূন্যতম সংখ্যার কোড সহ এটি সঠিকভাবে শেষ করার সবচেয়ে কার্যকর মাধ্যম।

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

প্রোটোকল / "স্রষ্টা" শ্রেণীর তৈরি করা সমস্ত শ্রেণীর অন্তরঙ্গ প্রবেশাধিকারের জন্য এটি OOP লঙ্ঘন - এটি স্রেফ নির্বোধ যে নির্ধারিত তা নির্ধারণ করার জন্য - স্রষ্টা শ্রেণিকে পথের প্রতিটি বিট ডেটা বিট করতে হয়েছিল। আমি যে বিষয়টি সবচেয়ে গুরুত্বপূর্ণ পেয়েছি তা হ'ল বিএসের অতিরিক্ত সমস্ত কোডের লাইনকে "ওওপি'র সেক" মডেলটি সাধারণত পরিচালনা করে। অতিরিক্ত স্প্যাগেটি কেবল আরও বাগ তৈরি করে।

লোকেরা কি জানে যে আপনি গুন, সম্পত্তি এবং পদ্ধতি স্তরে অভ্যন্তরীণ কীওয়ার্ডটি প্রয়োগ করতে পারেন? এটি কেবলমাত্র শীর্ষ স্তরের শ্রেণির ঘোষণার জন্য নয় (যদিও বেশিরভাগ উদাহরণে এটি প্রদর্শিত হয়)

আপনার যদি একটি সি ++ শ্রেণি থাকে যা বন্ধু কীওয়ার্ড ব্যবহার করে এবং একটি সি # শ্রেণিতে অনুকরণ করতে চান: 1. সি # শ্রেণিকে সর্বজনীন ঘোষণা করুন 2. সি ++ এ সুরক্ষিত সমস্ত বৈশিষ্ট্য / বৈশিষ্ট্য / পদ্ধতিগুলি ঘোষণা করুন এবং এভাবে বন্ধুদের কাছে অ্যাক্সেসযোগ্য সি # 3 এ অভ্যন্তরীণ সমস্ত অভ্যন্তরীণ বৈশিষ্ট্য এবং বৈশিষ্ট্যে জনসাধারণের অ্যাক্সেসের জন্য কেবল পঠিত বৈশিষ্ট্য তৈরি করুন

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

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


1

ইন্টারফেস এবং বাস্তবায়ন পৃথক করে বন্ধুত্ব অনুকরণ করা যেতে পারে। ধারণাটি হ'ল: " একটি কংক্রিট উদাহরণ প্রয়োজন তবে সেই দৃষ্টান্তের নির্মাণ অ্যাক্সেসকে সীমাবদ্ধ করুন "।

উদাহরণ স্বরূপ

interface IFriend { }

class Friend : IFriend
{
    public static IFriend New() { return new Friend(); }
    private Friend() { }

    private void CallTheBody() 
    {  
        var body = new Body();
        body.ItsMeYourFriend(this);
    }
}

class Body
{ 
    public void ItsMeYourFriend(Friend onlyAccess) { }
}

এই বিষয়টি সত্ত্বেও যে ItsMeYourFriend()সর্বজনীন কেবলমাত্র Friendশ্রেণিই এটি অ্যাক্সেস করতে পারে, যেহেতু অন্য কেউই সম্ভবত Friendক্লাসের একটি দৃ concrete় উদাহরণ পেতে পারে না । এটিতে একটি প্রাইভেট কনস্ট্রাক্টর রয়েছে, যখন কারখানার New()পদ্ধতিতে একটি ইন্টারফেস দেয়।

আমার নিবন্ধটি দেখুন বন্ধুরা এবং অভ্যন্তরীণ ইন্টারফেস সদস্যদের বিনা মূল্যে ইন্টারফেসে কোডিংয়ের সাথে


দুঃখজনকভাবে বন্ধুত্ব কোনও সম্ভাব্য উপায়ে অনুকরণ করা যায় না। : এই প্রশ্ন দেখতে পাবেন stackoverflow.com/questions/5921612/...
kaalus

1

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

আমার একটি এএসপি.এনইটি পৃষ্ঠা রয়েছে যা আমার নিজস্ব পৃষ্ঠাটি উত্তরাধিকার সূত্রে উত্তম হয়, যা পরবর্তীতে System.Web.UI.Page উত্তরাধিকার সূত্রে প্রাপ্ত হয়। এই পৃষ্ঠায়, আমার কিছু কোড রয়েছে যা একটি সুরক্ষিত পদ্ধতিতে অ্যাপ্লিকেশনটির জন্য শেষ-ব্যবহারকারীর ত্রুটি প্রতিবেদন পরিচালনা করে

ReportError("Uh Oh!");

এখন, আমার পৃষ্ঠায় থাকা একটি ব্যবহারকারীর নিয়ন্ত্রণ রয়েছে। আমি চাই ব্যবহারকারী ব্যবহারকারী পৃষ্ঠায় ত্রুটি প্রতিবেদন করার পদ্ধতিগুলিতে কল করতে সক্ষম হন।

MyBasePage bp = Page as MyBasePage;
bp.ReportError("Uh Oh");

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

protected void ReportError(string str) {
    MyBasePage bp = Page as MyBasePage;
    bp.ReportError(str);
}

আমি বিশ্বাস করি যে ভাষার মতো বন্ধুর মতো ভাষা ভাষাতে কম "OO" তৈরি না করেই ব্যবহারযোগ্য এবং প্রয়োগ করা যেতে পারে, সম্ভবত বৈশিষ্ট্য হিসাবে, যাতে আপনার ক্লাস বা পদ্ধতিগুলি নির্দিষ্ট শ্রেণি বা পদ্ধতির বন্ধু হতে পারে, বিকাশকারীকে খুব সরবরাহ করতে দেয় নির্দিষ্ট অ্যাক্সেস। সম্ভবত এর মতো কিছু ... (সিউডো কোড)

[Friend(B)]
class A {

    AMethod() { }

    [Friend(C)]
    ACMethod() { }
}

class B {
    BMethod() { A.AMethod() }
}

class C {
    CMethod() { A.ACMethod() }
}

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

class BasePage {

    [Friend(BaseControl.ReportError(string)]
    protected void ReportError(string str) { }
}

class BaseControl {
    protected void ReportError(string str) {
        MyBasePage bp = Page as MyBasePage;
        bp.ReportError(str);
    }
}

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


0

আপনি যদি সি ++ নিয়ে কাজ করছেন এবং আপনি যদি বন্ধু কীওয়ার্ড ব্যবহার করে নিজেকে আবিষ্কার করেন তবে এটি একটি খুব দৃ strong় ইঙ্গিত, আপনার একটি ডিজাইনের সমস্যা রয়েছে কারণ হেক শ্রেণীর অন্যান্য শ্রেণীর ব্যক্তিগত সদস্যদের অ্যাক্সেসের প্রয়োজন কেন ??


আমি রাজী. আমার কখনই বন্ধুর কীওয়ার্ড লাগবে না। জটিল রক্ষণাবেক্ষণ সংক্রান্ত সমস্যাগুলি সমাধান করার জন্য এটি সাধারণত ব্যবহৃত হয়।
এডুয়ার্ড এ।

7
অপারেটর ওভারলোডিং, কেউ ??
আমরা সমস্ত মনিকা

3
আপনি কতবার গুরুত্ব সহকারে ওভারলোডিংয়ের জন্য ভাল কেসটি খুঁজে পেয়েছেন?
বশমহোন্দেস

8
আমি আপনাকে একটি খুব সাধারণ কেস দেব যা আপনার 'ডিজাইন ইস্যু' মন্তব্যটি সম্পূর্ণভাবে সরিয়ে ফেলবে। মূল-শিশু। একজন পিতা-মাতার নিজের সন্তান রয়েছে। পিতামাতার 'শিশু' সংগ্রহের কোনও শিশু সেই পিতামাতার মালিকানাধীন। সন্তানের উপর পিতামাতার সম্পত্তিটির সেটটারটি কেবল কারও দ্বারা নিষ্পত্তিযোগ্য হওয়া উচিত নয়। যখন সন্তানের পিতামাতার বাচ্চাদের সংগ্রহে যুক্ত করা হয় কেবল তখনই এটি নির্ধারণ করা দরকার। যদি এটি সর্বজনীন হয় তবে যে কেউ এটি পরিবর্তন করতে পারবেন। অভ্যন্তরীণ: যে সমাবেশে যে কেউ। ব্যক্তিগত? কেউ না. সেটারকে পিতামাতার বন্ধু বানানো সেগুলি কেসগুলি সরিয়ে দেয় এবং এখনও আপনার ক্লাসগুলি পৃথক রাখে, তবে শক্তভাবে সম্পর্কিত। Huzzah !!
মার্ক এ। ডোনোহো

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

0

BSD

এটা বলা হয়েছিল যে, বন্ধুরা খাঁটি ওজনকে কষ্ট দেয়। যা আমি একমত।

এটাও বলা হয়েছিল যে বন্ধুরা এনক্যাপসুলেশন সহায়তা করে, যা আমিও সম্মত।

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

যে কেউ অনুসরণ করে তা বাস্তবায়ন করতে পারে

    class C1
    {
        private void MyMethod(double x, int i)
        {
            // some code
        }
        // the friend class would be able to call myMethod
        public void MyMethod(FriendClass F, double x, int i)
        {
            this.MyMethod(x, i);
        }
        //my friend class wouldn't have access to this method 
        private void MyVeryPrivateMethod(string s)
        {
            // some code
        }
    }
    class FriendClass
    {
        public void SomeMethod()
        {
            C1 c = new C1();
            c.MyMethod(this, 5.5, 3);
        }
    }

এটি অবশ্যই একটি সংকলক সতর্কবার্তা উত্পন্ন করবে এবং ইন্টেলিজেন্সকে আঘাত করবে। তবে এটি কাজটি করবে।

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

#if UNIT_TESTING
        public
#else
        private
#endif
            double x;

সুতরাং আপনি UNIT_TESTING সংজ্ঞায়িত না করে আপনার সমস্ত কোডটি লিখুন এবং আপনি যখন ইউনিট পরীক্ষা করতে চান তখন আপনি ফাইলের প্রথম লাইনে # সংজ্ঞায়িত UNIT_TESTING যুক্ত করেন (এবং সমস্ত কোড লিখুন যা ইউনিট টেস্টিং করে #if UNIT_TESTING এর অধীনে)। এটি সাবধানে পরিচালনা করা উচিত।

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


2
সেই ফ্রেন্ডক্লাস প্যারামিটার অ্যাক্সেস নিয়ন্ত্রণ হিসাবে কাজ করে না: আপনি যে c.MyMethod((FriendClass) null, 5.5, 3)কোনও ক্লাস থেকে কল করতে পারেন ।
জেসি ম্যাকগ্রু

0

"এজেন্ট" - কিছু অভ্যন্তরীণ ক্লাস ব্যবহার করেও বন্ধুত্ব অনুকরণ করা যেতে পারে। নিম্নলিখিত উদাহরণ বিবেচনা করুন:

public class A // Class that contains private members
{
  private class Accessor : B.BAgent // Implement accessor part of agent.
  {
    private A instance; // A instance for access to non-static members.
    static Accessor() 
    { // Init static accessors.
      B.BAgent.ABuilder = Builder;
      B.BAgent.PrivateStaticAccessor = StaticAccessor;
    }
    // Init non-static accessors.
    internal override void PrivateMethodAccessor() { instance.SomePrivateMethod(); }
    // Agent constructor for non-static members.
    internal Accessor(A instance) { this.instance = instance; }
    private static A Builder() { return new A(); }
    private static void StaticAccessor() { A.PrivateStatic(); }
  }
  public A(B friend) { B.Friendship(new A.Accessor(this)); }
  private A() { } // Private constructor that should be accessed only from B.
  private void SomePrivateMethod() { } // Private method that should be accessible from B.
  private static void PrivateStatic() { } // ... and static private method.
}
public class B
{
  // Agent for accessing A.
  internal abstract class BAgent
  {
    internal static Func<A> ABuilder; // Static members should be accessed only by delegates.
    internal static Action PrivateStaticAccessor;
    internal abstract void PrivateMethodAccessor(); // Non-static members may be accessed by delegates or by overrideable members.
  }
  internal static void Friendship(BAgent agent)
  {
    var a = BAgent.ABuilder(); // Access private constructor.
    BAgent.PrivateStaticAccessor(); // Access private static method.
    agent.PrivateMethodAccessor(); // Access private non-static member.
  }
}

এটি কেবলমাত্র স্থিতিশীল সদস্যদের অ্যাক্সেসের জন্য ব্যবহৃত হলে এটি অনেক সহজ হতে পারে। এই ধরনের বাস্তবায়নের সুবিধাগুলি হ'ল সমস্ত প্রকারের বন্ধুত্বের ক্লাসগুলির অভ্যন্তরীণ সুযোগে ঘোষণা করা হয় এবং ইন্টারফেসের বিপরীতে এটি স্থির সদস্যদের অ্যাক্সেস করতে দেয়।

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