জিনিসগুলি অপরিবর্তনীয় হিসাবে চিহ্নিত করতে সক্ষম হওয়ার জন্য এটি প্রায়শই ডিজাইনের দৃষ্টিকোণ থেকে কার্যকর হয়। একইভাবে const
সংস্থাগুলি প্রহরী সরবরাহ করে এবং নির্দেশ দেয় যে কোনও রাষ্ট্রের পরিবর্তন হওয়া উচিত নয়, final
তা বোঝাতে ব্যবহার করা যেতে পারে যে আচরণের ফলে উত্তরাধিকারের স্তরক্রমকে আরও পরিবর্তন করা উচিত নয়।
উদাহরণ
একটি ভিডিও গেম বিবেচনা করুন যেখানে যানবাহনগুলি খেলোয়াড়কে এক অবস্থান থেকে অন্য জায়গায় নিয়ে যায়। সমস্ত যানবাহনের প্রস্থানের পূর্বে তারা কোনও বৈধ স্থানে ভ্রমণ করছেন কিনা তা নিশ্চিত করতে হবে (অবস্থানের বেসটি ধ্বংস হয় না, তা নিশ্চিত করে)। যানবাহন নির্বিশেষে এই চেকটি করা হয়েছে কিনা তার গ্যারান্টি আমরা অ-ভার্চুয়াল ইন্টারফেস আইডিয়ম (এনভিআই) ব্যবহার করে শুরু করতে পারি।
class Vehicle
{
public:
virtual ~Vehicle {}
bool transport(const Location& location)
{
// Mandatory check performed for all vehicle types. We could potentially
// throw or assert here instead of returning true/false depending on the
// exceptional level of the behavior (whether it is a truly exceptional
// control flow resulting from external input errors or whether it's
// simply a bug for the assert approach).
if (valid_location(location))
return travel_to(location);
// If the location is not valid, no vehicle type can go there.
return false;
}
private:
// Overridden by vehicle types. Note that private access here
// does not prevent derived, nonfriends from being able to override
// this function.
virtual bool travel_to(const Location& location) = 0;
};
এখন আসুন আমরা বলি যে আমাদের গেমটিতে আমাদের উড়ন্ত যানবাহন রয়েছে, এবং সমস্ত উড়ন্ত যানবাহনগুলির প্রয়োজনীয় এবং প্রচলিত বিষয় এটি হ'ল টেক-অফ করার আগে তাদের অবশ্যই হ্যাঙ্গারের অভ্যন্তরে একটি সুরক্ষা পরিদর্শন পরীক্ষার মধ্য দিয়ে যেতে হবে।
এখানে আমরা final
গ্যারান্টি দিয়ে ব্যবহার করতে পারি যে সমস্ত উড়ন্ত যানবাহন এই ধরণের পরিদর্শন করে এবং উড়ন্ত যানগুলির এই নকশার প্রয়োজনীয়তার কথাও জানায়।
class FlyingVehicle: public Vehicle
{
private:
bool travel_to(const Location& location) final
{
// Mandatory check performed for all flying vehicle types.
if (safety_inspection())
return fly_to(location);
// If the safety inspection fails for a flying vehicle,
// it will not be allowed to fly to the location.
return false;
}
// Overridden by flying vehicle types.
virtual void safety_inspection() const = 0;
virtual void fly_to(const Location& location) = 0;
};
এইভাবে ব্যবহার করে final
, আমরা কার্যকরভাবে উত্তরাধিকারক্রমক্রমের নীচে (এমনকি একটি উত্তরোত্তর হিসাবে, ভঙ্গুর বেস শ্রেণীর সমস্যা মোকাবেলা করে) ভার্চুয়াল ফাংশনগুলিতে আনুপাতিক ইন্টারফেস আইডিয়মের নমনীয়তা প্রসারিত করার পদ্ধতিটি করছি themselves তদুপরি, আমরা প্রত্যেকটি উড়ন্ত যানবাহনের বাস্তবায়ন যেটি বিদ্যমান রয়েছে তা পরিবর্তন না করে কেন্দ্রীয় পরিবর্তন করতে সমস্ত বিমানের ধরণগুলিকে প্রভাবিত করে এমন কেন্দ্রীয় পরিবর্তনগুলি করার জন্য আমরা উইগল রুম কিনি।
এটি ব্যবহারের যেমন একটি উদাহরণ final
। আপনার মুখোমুখি এমন প্রেক্ষাপট রয়েছে যেখানে ভার্চুয়াল সদস্য ফাংশনটির পক্ষে আর কোনও কাজ ওভাররাইড করা সহজ হয় না - এটি করার ফলে একটি ভঙ্গুর নকশা এবং আপনার নকশার প্রয়োজনীয়তার লঙ্ঘন হতে পারে।
যেখানে এটা final
একটি নকশা / স্থাপত্য দৃষ্টিকোণ থেকে দরকারী।
এটি অপ্টিমাইজারের দৃষ্টিকোণ থেকেও দরকারী কারণ এটি এই নকশার তথ্যটি অপ্টিমাইজার সরবরাহ করে যা ভার্চুয়াল ফাংশন কলগুলিকে ভার্চুয়ালাইজ করতে দেয় (ডায়নামিক প্রেরণ ওভারহেডকে সরিয়ে দেয়, এবং প্রায়শই আরও উল্লেখযোগ্যভাবে, কলার এবং কলির মধ্যে একটি অপ্টিমাইজেশন বাধা দূর করে)।
প্রশ্ন
মন্তব্য থেকে:
চূড়ান্ত এবং ভার্চুয়াল কেন একই সময়ে ব্যবহৃত হবে?
এটা একটা অনুক্রমের root- এ একটি বেস বর্গ জন্য অর্থে দেখা যায় না উভয় হিসাবে একটি ফাংশন ডিক্লেয়ার করার মত virtual
এবং final
। এটি আমার কাছে বেশ নির্বোধ বলে মনে হয়, কারণ এটি সংকলক এবং মানব পাঠক উভয়কেই অপ্রয়োজনীয় হুপের মধ্য দিয়ে ঝাঁপিয়ে পড়তে হবে যা কেবল virtual
এ জাতীয় ক্ষেত্রে সরাসরি এড়িয়ে চলা যায় । তবে, সাবক্লাসগুলি ভার্চুয়াল সদস্য ফাংশনগুলির উত্তরাধিকার সূত্রে প্রাপ্ত:
struct Foo
{
virtual ~Foo() {}
virtual void f() = 0;
};
struct Bar: Foo
{
/*implicitly virtual*/ void f() final {...}
};
এই ক্ষেত্রে, Bar::f
স্পষ্টভাবে ভার্চুয়াল কীওয়ার্ডটি ব্যবহার করুন বা না করুন , Bar::f
এটি একটি ভার্চুয়াল ফাংশন। virtual
কীওয়ার্ডটি তখন এক্ষেত্রে becomesচ্ছিক হয়। সুতরাং এটি ভার্চুয়াল ফাংশন হয়ে থাকলেও ( কেবল ভার্চুয়াল ফাংশনগুলির জন্যই ব্যবহার করা যেতে পারে) এটি Bar::f
নির্দিষ্ট করার জন্য এটি বোধগম্য হতে পারে ।final
final
এবং কিছু লোক স্পাইলালিস্টিকভাবে স্পষ্টভাবে নির্দেশ করতে পারে যে Bar::f
ভার্চুয়াল, যেমন:
struct Bar: Foo
{
virtual void f() final {...}
};
আমার কাছে এ প্রসঙ্গে একইভাবে (একইভাবে এবং ) একই ফাংশনের জন্য virtual
এবং final
স্পেসিফায়ার উভয়ই ব্যবহার করা এক ধরণের অপ্রয়োজনীয় , তবে এটি ক্ষেত্রে স্টাইলের বিষয়। কিছু লোক খুঁজে পেতে পারে যে এখানে মূল্যবান কিছু যোগাযোগ করে, যেমন বহিরাগত সংযোগের সাথে ফাংশন ঘোষণার জন্য ব্যবহার করা (যদিও এটিতে অন্যান্য লিঙ্কেজের যোগ্যতার অভাব থাকলেও)।virtual
override
virtual
extern