ฉันมีปัญหาเกี่ยวกับการซ่อนชื่อซึ่งแก้ยากมาก นี่คือเวอร์ชันที่เรียบง่ายที่อธิบายปัญหา:
มีคลาส: 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::ใน C # หรือ::ใน C ++ ฉันสามารถขึ้นต้นnetด้วยคำนำหน้าส่วนกลางนี้ได้ แต่ Java ไม่อนุญาต
public void help(net.foo.X x) { x.doSomething(); }และโทรหาhelp(null);