У мене проблема з приховуванням імен, яку надзвичайно важко вирішити. Ось спрощена версія, яка пояснює проблему:
Є клас: 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 цього не дозволяє.
net.foo.X
має метод, ні org.A.X
!
A
? Спадщина може бути такою неприємною, як ви виявили ...
I could call another class that in turn calls X.doSomething(); but this class would only exist because of the name clash, which seems very messy
+1 за ставлення до чистого коду. Але для мене здається, що це така ситуація, яку ви повинні зробити компромісом. Просто зробіть це та додайте приємний довгий коментар про те, чому вам це довелося зробити (можливо, із посиланням на це питання).
public void help(net.foo.X x) { x.doSomething(); }
і зателефонувати зhelp(null);