Как получить доступ к переменной родительского класса через дочерний класс - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь пересмотреть подход ООП к мобильной проверке на усмотрение разработчиков.Идея, которую я придумаю, состоит в том, чтобы позволить интерфейсам манипулировать классом.Если класс реализует интерфейс, тогда будет выполнен метод verify.

Проблема, с которой я сталкиваюсь, потому что я привык только к программированию на языках с менее строгой типизацией (PHP), это как получить защищенную переменнуюиз класса, расширяющего текущий класс.

_areaCodes.stream().forEach(o -> {
    try {
        int prefix = Integer.parseInt(this._mobileNumber.charAt(0), this._mobileNumber.charAt(1));
    } catch (Exception e) {}
});

Эта строка кода теперь дает мне ошибку

_mobileNumber не может быть разрешен или не является полем

Вот мой полный код, а вот пример Я написал ту же концепцию в PHP, которую я пытаюсь реализовать в Java.

import java.util.ArrayList;

interface Verification
{
    public void initVerification();
}

class AreaCode
{
    private int _code;
    private String _country;

    public AreaCode(int code, String country)
    {
        this._code = code;
        this._country = country;
    }

    public int getAreaCode() { return this._code; }
    public String getAreaCountry() { return this._country; }
}

class VerificationHandler
{
    private ArrayList<AreaCode> _areaCodes = new ArrayList<AreaCode>() {{
        this.add(new AreaCode(44, "UNITED KINGDOM"));
        this.add(new AreaCode(91, "INDIA"));
    }};

    public void initVerification()
    {
        if(this instanceof Verification) {
            this.verify();
        }
    }

    protected void verify()
    {
        _areaCodes.stream().forEach(o -> {
        try {
            int prefix = Integer.parseInt(this._mobileNumber.charAt(0), this._mobileNumber.charAt(1));
        } catch (Exception e) {}
    });
    }
}


class Main extends VerificationHandler implements Verification {
    protected String _mobileNumber = "+447435217761";
}

public class Hack1337 { public static void main(String[] args) { new Main(); } }

Как я могу получитьпеременная в классе, расширяющая другой, то есть:

class A { public String getB() { return this.b; } }
class B extends A { protected String b = 'A should get this'; }
B b = new B().getB();

1 Ответ

0 голосов
/ 12 декабря 2018

Только экземпляры класса B или подклассы B могут напрямую обращаться к переменной экземпляра b (если вы не приведете A к B в теле класса A, чтоэто плохая практика).

Вы можете дать классу A доступ только для чтения к этому значению, переопределив getB():

class B extends A
{ 
    protected String b = 'A should get this';

    @Override
    public String getB() { 
        return this.b; 
    } 
}

, и вы также можете захотеть сделать getB() метод abstract в классе A (что означает создание класса A abstract):

abstract class A 
{
    public abstract String getB();
}

Это будет иметь смысл, только если ожидается, что разные подклассы A будут возвращать разные вещи в *1021. *В противном случае вы также можете переместить переменную b в базовый класс A.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...