@ ক্লাস বনাম # ইম্পোর্ট


709

আমার বোধগম্যতা হল যে ক্লাসএতে একটি ক্লাসবি শিরোনাম অন্তর্ভুক্ত করা উচিত ইভেন্টে একজনকে ফরোয়ার্ড-ক্লাসের ঘোষণা ব্যবহার করা উচিত এবং কোনও বৃত্তাকার অন্তর্ভুক্তি এড়াতে ক্লাসবি শিরোনাম অন্তর্ভুক্ত করা উচিত। আমি এটিও বুঝতে পারি যে একটি #importএকটি সাধারণ ifndefযাতে একটি অন্তর্ভুক্ত শুধুমাত্র একবার হয়।

আমার তদন্তটি এটি: একটি কখন ব্যবহার করে #importএবং কখন একটি ব্যবহার করে @class? কখনও কখনও আমি যদি কোনও @classঘোষণা ব্যবহার করি , আমি নিম্নলিখিতগুলির মতো একটি সাধারণ সংকলক সতর্কতা দেখতে পাই:

warning: receiver 'FooController' is a forward class and corresponding @interface may not exist.

এইটি বুঝতে সত্যিই পছন্দ করবে, কেবলমাত্র @classফরওয়ার্ড-ডিক্লেশনটি সরিয়ে ফেলা এবং #importসংকলক আমাকে যে সতর্কতাগুলি দিচ্ছে তা নিরব করে দেওয়ার জন্য।


10
ফরোয়ার্ড ঘোষণাটি কেবল সংকলককে বলে, "আরে, আমি জানি যে আমি এমন জিনিসগুলি ঘোষণা করছি যা আপনি চিনতে পারছেন না, কিন্তু যখন আমি @ মাই ক্লাস বলি, আমি প্রতিশ্রুতি দিচ্ছি যে আমি এটি বাস্তবায়নে # ইমপোর্ট করব"।
জো কর্টোপাসি

উত্তর:


754

আপনি যদি এই সতর্কতাটি দেখেন:

সতর্কতা: রিসিভার 'মাইকুলক্লাস' একটি ফরোয়ার্ড ক্লাস এবং সম্পর্কিত @ ইনটারফেসের অস্তিত্ব থাকতে পারে

আপনার #importফাইলটি দরকার , তবে আপনি এটি আপনার প্রয়োগকারী ফাইল (। মি) এ করতে পারেন @classএবং আপনার শিরোনাম ফাইলে ঘোষণাটি ব্যবহার করতে পারেন ।

@class(সাধারণত) #importফাইলগুলির প্রয়োজনীয়তা অপসারণ করে না , এটি কেবল তথ্যটি কার্যকর যেখানে প্রয়োজনীয়তার কাছাকাছি চলে যায়।

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

আপনি যদি বলেন @class MyCoolClass, সংকলকটি জানে যে এটি এর মতো কিছু দেখতে পারে:

MyCoolClass *myObject;

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

তবে, আপনার যদি কখনও myObjectসদস্যদের তৈরি বা অ্যাক্সেসের প্রয়োজন হয়, আপনাকে এই পদ্ধতিগুলি কী তা সংকলককে জানাতে হবে। এই মুহুর্তে (সম্ভবত আপনার বাস্তবায়ন ফাইলে), আপনাকে #import "MyCoolClass.h""" এটি একটি শ্রেণি "এর বাইরে সংকলককে অতিরিক্ত তথ্য জানাতে হবে।


5
দুর্দান্ত উত্তর, ধন্যবাদ। ভবিষ্যতে উল্লেখের জন্য: এই পরিস্থিতিতে যেখানে আপনি সঙ্গে পুলিশ @classআপনার কিছু .hফাইল, কিন্তু করতে ভুলবেন #import.m এটা, উপর একটি পদ্ধতি অ্যাক্সেস করতে চেষ্টা @classইডি বস্তু, এবং ধরণের সাবধানবাণীর পাবেন: warning: no -X method found
টিম

24
আপনার যদি ক্লাসের ইন্টারফেসের জন্য প্রয়োজনীয় ডেটা বা অন্যান্য সংজ্ঞা অন্তর্ভুক্ত করা হয় তবে ডাব্লুএইচ ফাইলটিতে @ ক্লাসের পরিবর্তে # আমদানি করা দরকার case
কেন আস্পেসলাগ

2
এখানে অন্য উল্লেখযোগ্য সুবিধাটি উল্লেখ করা হয়নি তা হ'ল দ্রুত সংকলন। দয়া করে ভেঙ্কটেশ্বরের উত্তরটি দেখুন
মার্টিনমাইজার্ড

@ বেনগটলিব "মাইকুলক্লাস" এর 'মি' বড় হাতের না হওয়া উচিত? যেমন আছে, "মাইকুলক্লাস"?
বাসিল বাউর্ক

182

তিনটি সহজ নিয়ম:

  • #importহেডার ফাইলগুলিতে ( .hফাইল) কেবলমাত্র সুপার ক্লাস, এবং গৃহীত প্রোটোকল ।
  • #importসমস্ত ক্লাস এবং প্রোটোকল, আপনি প্রয়োগ (বার্তা .m) এ বার্তা প্রেরণ ।
  • সমস্ত কিছুর জন্য ফরোয়ার্ড ঘোষণা

যদি আপনি বাস্তবায়ন ফাইলগুলিতে ফরোয়ার্ড ঘোষণা করেন, তবে আপনি সম্ভবত কিছু ভুল করেছেন।


22
শিরোলেখ ফাইলগুলিতে আপনাকে আপনার ক্লাসটি গ্রহণ করে এমন একটি প্রোটোকল সংজ্ঞায়িত করে এমন কোনও কিছু ইমপোর্ট করতেও পারে।
টাইলার

এইচ ইন্টারফেস ফাইল বা এম বাস্তবায়ন ফাইলে # ইম্পোর্ট ঘোষণার মধ্যে কি কোনও পার্থক্য রয়েছে?
স্যামুয়েল জি

আপনি যদি ক্লাস থেকে উদাহরণ ভেরিয়েবল ব্যবহার করেন তবে #
ইমপোর্ট করুন

1
@ মার্ক - বিধি # 1 দ্বারা আচ্ছাদিত, কেবল আপনার সুপারক্লাস থেকে আইভারগুলি অ্যাক্সেস করুন।
পেইলডাব্লু

@ টাইলার কেন প্রোটোকলের ঘোষণা ফরওয়ার্ড করবেন না?
জো কর্টোপাসি

110

উদ্দেশ্য সি এ ভাষা ডকুমেন্টেশন প্রোগ্রামিং তাকান এডিসি

বিভাগ নির্ধারণের উপর একটি বিভাগ | শ্রেণি ইন্টারফেস এটি করা হচ্ছে কেন তা বর্ণনা করে:

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

আশা করি এটা কাজে লাগবে.


48

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

এর ব্যতিক্রম হ'ল #importআপনার শিরোনাম ফাইলে আপনি যে বর্গ বা আনুষ্ঠানিক প্রোটোকলটি উত্তরাধিকার সূত্রে পেয়েছেন তা হওয়া উচিত (এক্ষেত্রে আপনাকে এটি প্রয়োগের ক্ষেত্রে আমদানি করার প্রয়োজন হবে না)।


24

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


2
আমি ভেবেছিলাম # ইম্পোর্টটি # অন্তর্ভুক্তের চেয়ে ভাল যে এটি কেবল একটি উদাহরণ আমদানি করে?
ম্যাথু শিনকেল

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

1
বর্তমান ডক্স বলে যে #import", সি এর #include নির্দেশ মত হল ব্যতীত এটি নিশ্চিত যে একই ফাইল একাধিকবার অন্তর্ভুক্ত না হয়।" সুতরাং এটি অনুসারে #importবিজ্ঞপ্তি অন্তর্ভুক্তির যত্ন নেয়, @classনির্দেশিকা এতে বিশেষভাবে সহায়তা করে না।
এরিক

24

আরেকটি সুবিধা: দ্রুত সংকলন

আপনি যদি একটি শিরোলেখ ফাইল অন্তর্ভুক্ত করেন তবে এর যে কোনও পরিবর্তনের ফলে বর্তমান ফাইলটিও সংকলিত হতে পারে তবে শ্রেণীর নাম হিসাবে অন্তর্ভুক্ত করা থাকলে এই ক্ষেত্রে হবে না @class name। অবশ্যই আপনার উত্স ফাইলে শিরোনাম অন্তর্ভুক্ত করতে হবে


18

আমার তদন্ত এই। যখন কেউ # আমদানি ব্যবহার করে এবং যখন কেউ @ ক্লাস ব্যবহার করে?

সহজ উত্তর: আপনি #importবা #includeযখন কোনও শারীরিক নির্ভরতা থাকে। অন্যথা, আপনি এগিয়ে ঘোষণা ব্যবহার করুন ( @class MONClass, struct MONStruct, @protocol MONProtocol)।

এখানে শারীরিক নির্ভরতার কয়েকটি সাধারণ উদাহরণ রয়েছে:

  • যে কোনও সি বা সি ++ মান (একটি পয়েন্টার বা রেফারেন্স কোনও শারীরিক নির্ভরতা নয়)। CGPointআইভার বা সম্পত্তি হিসাবে আপনার যদি একটি থাকে তবে সংকলকটির ঘোষণাপত্রটি দেখতে হবে CGPoint
  • আপনার সুপারক্লাস
  • আপনি যে পদ্ধতিটি ব্যবহার করেন।

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

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

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

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

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

অতএব, আমার প্রস্তাবটি যেখানে সম্ভব সেখানে অগ্রিম ব্যবহার করা এবং তারপরে #importযেখানে শারীরিক নির্ভরতা রয়েছে। আপনি যদি সতর্কতা বা অন্য কোনওটি দেখতে পান যা শারীরিক নির্ভরতা বোঝায় - এগুলি সব ঠিক করুন। #importআপনার বাস্তবায়ন ফাইলে ঠিক করা ।

আপনি যখন গ্রন্থাগারগুলি তৈরি করেন, আপনি সম্ভবত একটি গোষ্ঠী হিসাবে কিছু ইন্টারফেস শ্রেণিবদ্ধ করবেন, সেক্ষেত্রে আপনি #importসেই লাইব্রেরি যেখানে শারীরিক নির্ভরতা প্রবর্তন করা হবে (উদাঃ #import <AppKit/AppKit.h>)। এটি নির্ভরতা প্রবর্তন করতে পারে, তবে গ্রন্থাগার রক্ষণাবেক্ষণকারীরা আপনার প্রয়োজন হিসাবে প্রায়শই শারীরিক নির্ভরতা পরিচালনা করতে পারে - যদি তারা কোনও বৈশিষ্ট্য প্রবর্তন করে তবে তারা আপনার বিল্ডগুলিতে এর প্রভাবকে হ্রাস করতে পারে।


বিটিডব্লিউ বিষয়গুলি ব্যাখ্যা করার জন্য দুর্দান্ত প্রচেষ্টা। .কিন্তু এগুলি বেশ জটিল বলে মনে হচ্ছে।
অজয় শর্মা

NSObject types are never values -- NSObject types are always reference counted pointers.সম্পূর্ণ সত্য নয়। ব্লক আপনার উত্তরে একটি ফাঁক ফেলে দেয়, কেবল বলছে।
রিচার্ড জে রস তৃতীয়

@ রিচার্ড জে.রোসআইআইআই ... এবং জিসিসি একজনকে মান ঘোষণা করতে এবং ব্যবহার করতে দেয়, যখন ঝনঝন এটি নিষিদ্ধ করে। এবং অবশ্যই, পয়েন্টারের পিছনে অবশ্যই একটি মান থাকতে হবে।
জাস্টিন

11

আমি প্রচুর "এটি করুন" দেখি তবে "কেন?" এর কোনও উত্তর দেখছি না?

সুতরাং: আপনি কেন আপনার শিরোনামে ক্লাস করবেন এবং কেবলমাত্র আপনার প্রয়োগের ক্ষেত্রে # আমদানি করবেন? আপনি সর্বদা @ ক্লাস এবং # ইমপোর্ট করে আপনার কাজ দ্বিগুণ করছেন । যদি আপনি উত্তরাধিকার ব্যবহার না করেন। সেক্ষেত্রে আপনি একটি একক @ ক্লাসের জন্য একাধিকবার আমদানি করবেন। তারপরে হঠাৎ করে সিদ্ধান্ত নিলে আপনার আর কোনও ঘোষণায় অ্যাক্সেসের প্রয়োজন নেই বলে মনে করতে হবে আপনাকে একাধিক ভিন্ন ফাইল থেকে সরিয়ে ফেলতে হবে।

# ইম্পোর্টের প্রকৃতির কারণে একাধিকবার একই ফাইলটি আমদানি করা কোনও সমস্যা নয়। সংকলন কর্মক্ষমতা আসলেই কোনও সমস্যা নয়। যদি এটি হয় তবে আমরা # কোকো / কোকো এইচকে বা অন্য প্রতিটি হেডার ফাইলের মতো পছন্দ করব না।


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

7

যদি আমরা এটি করি

@interface Class_B : Class_A

এর অর্থ আমরা ক্লাস_একে ক্লাস_বি তে উত্তরাধিকারী করছি, ক্লাস_বিতে আমরা ক্লাস_এ এর সমস্ত ভেরিয়েবল অ্যাক্সেস করতে পারি।

যদি আমরা এটি করছি

#import ....
@class Class_A
@interface Class_B

এখানে আমরা বলছি যে আমরা আমাদের প্রোগ্রামে Class_A ব্যবহার করছি, তবে আমরা Class_B তে Class_A ভেরিয়েবলগুলি ব্যবহার করতে চাইলে আমাদের এম। এম ফাইলে ক্লাস_এর বর্গ তৈরি করতে হবে (একটি বস্তু তৈরি করুন এবং এটির ফাংশন এবং ভেরিয়েবলগুলি ব্যবহার করুন)।


5

ফাইল নির্ভরতা এবং # আমদানি এবং @ ক্লাস সম্পর্কে অতিরিক্ত তথ্যের জন্য এটি পরীক্ষা করে দেখুন:

http://qualitycoding.org/file-d dependferences/ এটা ভাল নিবন্ধ

নিবন্ধের সংক্ষিপ্তসার

শিরোলেখ ফাইলগুলিতে আমদানি:

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

প্রয়োগকারী ফাইলগুলিতে আমদানি:

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

3

আমি যখন বিকাশ করি তখন আমার মনে কেবল তিনটি জিনিস থাকে যা কখনই আমাকে কোনও সমস্যা করে না।

  1. সুপার ক্লাস আমদানি করুন
  2. অভিভাবক শ্রেণিগুলি আমদানি করুন (যখন আপনার সন্তান এবং পিতামাতারা থাকে)
  3. আপনার প্রকল্পের বাইরের ক্লাস আমদানি করুন (ফ্রেমওয়ার্ক এবং লাইব্রেরির মতো)

অন্যান্য সমস্ত ক্লাসের জন্য (আমার প্রকল্পের সাবক্ল্যাস এবং শিশু ক্লাস), আমি তাদের ফরোয়ার্ড-ক্লাসের মাধ্যমে ঘোষণা করি।


3

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

আপনার প্রথম চিন্তা সম্ভবত #importএটি।
এটি কিছু ক্ষেত্রে সমস্যা হতে পারে।

উদাহরণস্বরূপ, যদি আপনি শিরোনাম ফাইলটিতে সি-পদ্ধতিগুলির একগুচ্ছ, বা স্ট্রাক্টগুলি বা অনুরূপ কিছু বাস্তবায়ন করেন, কারণ সেগুলি একাধিকবার আমদানি করা উচিত নয়।

অতএব আপনি সংকলকটি এর সাথে বলতে পারেন @class:

আমি জানি আপনি সেই শ্রেণিটি জানেন না, তবে এটি বিদ্যমান। এটি অন্য কোথাও আমদানি বা বাস্তবায়ন হতে চলেছে

এটি মূলত সংকলকটিকে চুপ করে এবং সংকলন করতে বলে, যদিও এই ক্লাসটি কখনও বাস্তবায়িত হচ্ছে কিনা তা নিশ্চিত নয়।

আপনি সাধারণতঃ ব্যবহার করবে #importমধ্যে .m এবং @class ফাইল।


0

কেবলমাত্র সংকলককে ত্রুটি দেখাতে বাধা দেওয়ার জন্য ফরওয়ার্ড ঘোষণা।

সংকলকটি জানতে পারবে যে আপনি যে নামটি ঘোষণার জন্য আপনার শিরোনাম ফাইলটিতে ব্যবহার করেছেন সেটির সাথে শ্রেণি রয়েছে।


আপনি একটি সামান্য আরো নির্দিষ্ট হতে পারে?
স্যাম স্পেন্সার

0

সংকলক কেবল তখনই অভিযোগ করবে যখন আপনি that শ্রেণিটি এমনভাবে ব্যবহার করতে যাচ্ছেন যে সংকলকটির বাস্তবায়নটি জানতে হবে।

উদা:

  1. এটির মতো হতে পারে যদি আপনি এটি থেকে আপনার ক্লাস অর্জন করতে চলেছেন বা
  2. আপনি যদি সদস্য শ্রেণীর হিসাবে সেই শ্রেণীর একটি অবজেক্ট পেতে চলেছেন (যদিও বিরল)।

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

দ্রষ্টব্য: # আমদানি # অন্তর্ভুক্তের মতো নয়। এর অর্থ বিজ্ঞপ্তি আমদানি বলে কিছুই নেই। আমদানি হ'ল সংকলকটির জন্য কিছু তথ্যের জন্য নির্দিষ্ট ফাইলটি অনুসন্ধান করার অনুরোধ a যদি সেই তথ্য ইতিমধ্যে উপলব্ধ থাকে তবে সংকলক এটিকে উপেক্ষা করে।

এই চেষ্টা করে দেখুন, আহ-এ-তে এবং আহ-এ-তে আমদানি করুন কোনও সমস্যা বা অভিযোগ থাকবে না এবং এটিও ঠিক কাজ করবে।

@ ক্লাস কখন ব্যবহার করবেন

আপনি যদি নিজের শিরোনামে শিরোনামটি আমদানি করতে না চান তবেই আপনি @ ক্লাস ব্যবহার করেন। এটি এমন একটি ক্ষেত্রে হতে পারে যেখানে আপনি class শ্রেণীর কী হবে তা জানারও যত্ন নেন না। আপনার এখনও সেই শ্রেণীর জন্য শিরোনাম নাও থাকতে পারে এমন ক্ষেত্রে।

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


0

সংকলককে "বিশ্বাস করুন, এটি বিদ্যমান" বলার জন্য @ ক্লাসকে ভাবেন।

কপিরাইট-পেস্ট হিসাবে ইমপোর্টকে ভাবেন।

আপনি বেশ কয়েকটি কারণে আপনার যে পরিমাণ আমদানি করেছেন তা হ্রাস করতে চান। কোনও গবেষণা ছাড়াই, প্রথম যে বিষয়টি মনে আসে তা হ'ল এটি সঙ্কলনের সময় হ্রাস করে।

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


0

এটি একটি উদাহরণের দৃশ্যের যেখানে আমাদের ক্লাস প্রয়োজন need

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

// DroneSearchField.h

#import <UIKit/UIKit.h>
@class DroneSearchField;
@protocol DroneSearchFieldDelegate<UITextFieldDelegate>
@optional
- (void)DroneTextFieldButtonClicked:(DroneSearchField *)textField;
@end
@interface DroneSearchField : UITextField
@end
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.