নাম গোপনে আমার একটি সমস্যা রয়েছে যা সমাধান করা অত্যন্ত কঠিন। এখানে একটি সরলীকৃত সংস্করণ যা সমস্যাটি ব্যাখ্যা করে:
একটি শ্রেণি আছে: org.A
package org;
public class A{
public class X{...}
...
protected int net;
}
তারপরে একটা ক্লাস আছে net.foo.X
package net.foo;
public class X{
public static void doSomething();
}
এবং এখন, এখানে সমস্যাযুক্ত শ্রেণি যা উত্তরাধিকার সূত্রে প্রাপ্ত A
এবং কল করতে চায়net.foo.X.doSomething()
package com.bar;
class B extends A {
public void doSomething(){
net.foo.X.doSomething(); // doesn't work; package net is hidden by inherited field
X.doSomething(); // doesn't work; type net.foo.X is hidden by inherited X
}
}
যেমন আপনি দেখতে পাচ্ছেন, এটি সম্ভব নয়। আমি সাধারণ নামটি ব্যবহার করতে পারি না X
কারণ এটি উত্তরাধিকার সূত্রে প্রাপ্ত গোপন। আমি পুরোপুরি যোগ্য নামটি ব্যবহার করতে পারি না net.foo.X
, কারণ net
উত্তরাধিকারসূত্রে প্রাপ্ত ক্ষেত্রের দ্বারা গোপন।
ক্লাসটি B
আমার কোড বেসে রয়েছে; ক্লাস net.foo.X
এবং org.A
লাইব্রেরি ক্লাস হয়, তাই আমি তাদের পরিবর্তন করতে পারবেন না!
আমার একমাত্র সমাধানটি এর মতো দেখাচ্ছে: আমি অন্য ক্লাসকে কল করতে পারি যা ঘুরে ফিরে কল করে X.doSomething()
; তবে এই শ্রেণিটি কেবল নাম সংঘর্ষের কারণে উপস্থিত থাকবে যা খুব অগোছালো বলে মনে হচ্ছে! সেখানে কোন সমাধান যা আমি সরাসরি কল করতে পারেন X.doSomething()
থেকেB.doSomething()
?
এমন একটি ভাষায় যা গ্লোবাল নেমস্পেস নির্দিষ্ট করতে দেয়, উদাহরণস্বরূপ, global::
সি # বা ::
সি ++ এ, আমি কেবল net
এই গ্লোবাল উপসর্গের সাথে উপসর্গ করতে পারি , তবে জাভা সেটি অনুমতি দেয় না।
public void help(net.foo.X x) { x.doSomething(); }
এবং সাথে কল করুনhelp(null);