কেন সি # ইন্টারফেসে বৈশিষ্ট্যগুলিকে অনুমতি দেয়?


47

সি # তে, নিম্নলিখিত কোডটি বৈধ

interface I{
    int property{get;set;}
}

যা আমার কাছে কোন মানে করে না। এটি ইন্টারফেসের অন্যতম গুরুত্বপূর্ণ নীতি ভঙ্গ করে বলে মনে হচ্ছে: রাষ্ট্রের অভাব (অন্য কথায়, ক্ষেত্র নেই)। সম্পত্তি কি অন্তর্ভুক্ত ব্যক্তিগত ক্ষেত্র তৈরি করে না? ইন্টারফেসের জন্য এটি কি সত্যই খারাপ হবে না?


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

4
একটি সম্পত্তি কেবল একটি গেট পদ্ধতি এবং একটি সেট পদ্ধতি। যেহেতু ইন্টারফেসগুলি আপনাকে প্রয়োগ করতে হবে কেবল তার তালিকার একটি তালিকা, তাই স্বাভাবিক যে ইন্টারফেসগুলি সেগুলি করতে পারে।
ডোভাল

1
@ ফ্লোরিয়ানমারগাইন অবশ্যই একটি চুক্তির ধারণা ইন্টারফেসের সবচেয়ে গুরুত্বপূর্ণ নীতি, তবে রাষ্ট্রের অভাবও এটি গুরুত্বপূর্ণ। এটি এটি একটি বিমূর্ত শ্রেণীর থেকে পৃথক রাখতে সহায়তা করে। জাভা 8 এর IE এটি ইন্টারফেস এবং বিমূর্ত শ্রেণীর মধ্যে একমাত্র প্রধান পার্থক্য হিসাবে শেষ হয়।
মনিকা

2
কারণ এটি কোন ক্ষেত্র নয়। দেখুন কেন সি # ইন্টারফেসে ক্ষেত্র থাকতে পারে না?

2
@ ডোভাল: কোনও ইন্টারফেস এ জাতীয় পদ্ধতি ঘোষণা করে, এটি স্বাভাবিক যে এটি সেগুলি প্রয়োগ করে না।
জর্জিও

উত্তর:


65

আমার মনে হয় বিভ্রান্তিমূলক অংশটি হ'ল যদি আপনি int Property { get; set; }কোনও শ্রেণীর ভিতরে লিখেন তবে তা অন্তর্নিহিত ব্যাকিং ফিল্ড সহ একটি স্ব-সম্পত্তি।

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

পার্থক্যটি দেখার একটি উপায় হ'ল লিখন int Property { get; }: এটি একটি ইন্টারফেসে বৈধ এবং এমন একটি সম্পত্তি ঘোষণা করে যেখানে কেবল প্রাপ্তি রয়েছে তবে কোনও সেটর নেই। তবে এটি কোনও ক্লাসে সংকলন করবে না (যদি আপনি সি # 6.0 ব্যবহার করেন না), কারণ অটো-প্রপার্টিটিতে একটি সেটটার থাকতে হবে।


18

সম্পত্তি হিসাবে আপনি প্রদর্শিত হিসাবে সংজ্ঞা দেওয়া সংজ্ঞা পদ্ধতি int GetProperty()এবং হিসাবে একই void SetProperty(int i)। বৈশিষ্ট্যগুলি সি # তে শক্তিশালী শর্ট হ্যান্ড are

কোনও সম্পত্তি সুস্পষ্টভাবে সি # তে একটি ব্যক্তিগত ক্ষেত্র তৈরি করে না। এটি কোনওর ডিফল্ট বাস্তবায়ন auto-property, উদাহরণস্বরূপ public string MyString { get; set;}- তবে কোনও সম্পত্তি যা getপদ্ধতিতে কাস্টম লজিক সংজ্ঞায়িত করে তা কোনও অন্তর্নিহিত ব্যক্তিগত ক্ষেত্র তৈরি করে না।

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


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

9
আপনি যদি কোনও সি # ইন্টারফেসে কোনও সম্পত্তি সংজ্ঞায়িত করেন তবে সেই সম্পত্তিটির বাস্তবায়ন বাস্তবায়নকারী শ্রেণীর হাতে ছেড়ে দেওয়া হয় - তারা এটিকে একটি স্ব-সম্পত্তি হিসাবে তৈরি করতে পারে বা কাস্টম যুক্তিকে তারা যথাযথ হিসাবে সংজ্ঞায়িত করতে পারে। ইন্টারফেসে কোনও ক্ষেত্র যুক্ত হয় না ।
এনওয়ার্ড 21

10

প্রোপার্টি হয় পদ্ধতি! ক্লাসে একটি ব্যাকিং ফিল্ড যুক্ত করা হবে যা ইন্টারফেসটি প্রয়োগ করে (ম্যানুয়ালি বা কোনও অটো-প্রোপার্টি মাধ্যমে)।


কখনও কখনও কোনও ব্যাকিং ফিল্ড থাকবে না। যদিও এটি পাওয়া এবং সেট উভয়ই সংজ্ঞায়িত করা এবং এর জন্য ব্যাকিং ফিল্ড না রাখাই বিরল।
স্টিফেন

+1 সম্পত্তি পদ্ধতি হয়! হ্যাঁ! আমি প্রপার্টিমেডথগুলি লিখতে পছন্দ করি তবে কোড-পর্যালোচনা সহকর্মীরা সেভাবে দেখেন না এবং আমরা আমাদের প্রোগ্রামগুলিতে কিছু সুন্দর এক্সপ্রেসিভ এনক্যাপসুলেশনের জন্য সুযোগগুলি মিস করি।
রাডারবাব

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