ฉันมีปัญหาเกี่ยวกับการซ่อนชื่อซึ่งแก้ยากมาก นี่คือเวอร์ชันที่เรียบง่ายที่อธิบายปัญหา:
มีคลาส: 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);