Интерфейсы, классы и конструкторы в Java - PullRequest
1 голос
/ 08 апреля 2011

Вот что меня беспокоит в отношении интерфейсов и классов.

Я пытаюсь сделать реализацию для интерфейса с именем IPAddress классом с именем IPAddressString. Ipadress состоит из четырех частей.

Я пишу метод с именем mask, который маскирует текущий адрес с заданным. Маскировка операция - побитовая операция 'и' над всеми четырьмя частями адреса. Вы получаете все четыре части с помощью метода, который я написал с именем getOctet. (см. ниже).

Хорошо, мне нужно замаскировать свой this.IpAdress, с помощью которого я написал свой класс с новым общим IP-адресом.

При написании маски я столкнулся с проблемой. Я вычислил 4 целых числа, что с ними я хочу вернуть новый тип IPAddress. Для этого мне нужно использовать мой конструктор, который возвращает Тип IPAddressString, и, разумеется, я не могу преобразовать IPAddressString в IPAddress.

Я потерян. что я должен делать? почему моя конструкция не годится для этого? Разве IPAddressString не является подтипом IPAddress?

Вот код, который сделает его проще:

Вот интерфейс:

public interface IPAddress {

    /**
     * Returns a string representation of the IP address, e.g. "192.168.0.1"
     */
    public String toString();

    /**
     * Compares this IPAddress to the specified object
     * 
     * @param other
     *            the IPAddress to compare this string against
     * @return <code>true</code> if both IPAddress objects represent the same IP
     *         address, <code>false</code> otherwise.
     */
    public boolean equals(IPAddress other);

    /**
     * Returns one of the four parts of the IP address. The parts are indexed
     * from left to right. For example, in the IP address 192.168.0.1 part 0 is
     * 192, part 1 is 168, part 2 is 0 and part 3 is 1.
     * 
     * @param index
     *            The index of the IP address part (0, 1, 2 or 3)
     * @return The value of the specified part.
     */
    public int getOctet(int index);

    /**
     * Returns whether this address is a private network address. There are
     * three ranges of addresses reserved for 'private networks' 10.0.0.0 -
     * 10.255.255.255, 172.16.0.0 - 172.31.255.255 and 192.168.0.0 -
     * 192.168.255.255
     * 
     * @return <code>true</code> if this address is in one of the private
     *         network address ranges, <code>false</code> otherwise.
     * @see <a href="http://en.wikipedia.org/wiki/IPv4#Private_networks">Private Networks</a>
     */
    public boolean isPrivateNetwork();

    /**
     * Mask the current address with the given one. The masking operation is a
     * bitwise 'and' operation on all four parts of the address.
     * 
     * @param mask
     *            the IP address with which to mask
     * @return A new IP address representing the result of the mask operation.
     *         The current address is not modified.
     */
    public IPAddress mask(IPAddress mask);
}

Вот мой класс:

public class IPAddressString {

    private String IpAdress;

    public IPAddressString(int num1, int num2, int num3, int num4) {
        this.IpAdress = num1 + "." + num2 + "." + num3 + "." + num4;

    }


    public String toString() {
        return this.IpAdress;

    }

    public boolean equals(IPAddress other) {
        return ((other.toString()).equals(IpAdress));
    }

    public int getOctet(int index) {

        StringBuffer buf = new StringBuffer();
        int point = index;
        int countPoints = 0;

        for (int i = 0; i <= IpAdress.length() - 1; i++) {
            if ((IpAdress.charAt(i)) == '.') {
                countPoints++;

            }
            if ((countPoints == point) && IpAdress.charAt(i) != '.') {
                buf.append(IpAdress.charAt(i));
            }

        }
        String result = buf.toString();
        return Integer.parseInt(result);
    }

    public boolean isPrivateNetwork() {

        if (getOctet(0) == 10) {
            return true;
        }

        if (getOctet(0) == 172) {
            if (getOctet(1) >= 16 && getOctet(1) <= 31) {
                return true;
            }
        }

        if (getOctet(0) == 192) {
            if (getOctet(1) == 168) {
                return true;
            }
        }

        return false;

    }


    public IPAddress mask(IPAddress mask){
        int n0= mask.getOctet(0) & getOctet(0);
        int n1= mask.getOctet(1) & getOctet(1);
        int n2=mask.getOctet(2) & getOctet(2);
        int n3=mask.getOctet(3) & getOctet(3);



         IPAddress n1= new IPAddressString (n0,n1,n2,n3);
    }

}

Проблема снова в маске метода. Мне нужно вернуть новый IP-адрес, но я должен использовать мою конструкцию. что мне не хватает?

Спасибо.

Ответы [ 2 ]

5 голосов
/ 08 апреля 2011

Вы можете реализовать IPAddress в IPAddressString.Хотя вы реализуете все методы интерфейса IPAddress в своем классе IPAddressString, вы не сообщаете об этом компилятору [который явно не может угадать ваши намерения].

измените определение вашего класса на:

class IPAddressString implements IPAddress

Это должно решить проблему при конвертации.

Теперь эта строка:

IPAddress n1= new IPAddressString (n0,n1,n2,n3);

не доставит вам проблем, поскольку иерархия установлена.И вы можете спокойно вернуться n1.

1 голос
/ 08 апреля 2011

Простой открытый класс IPAddressString, реализующий IPAddress, решит проблему.

Еще одно предложение, которое бросилось мне в глаза:

Нет смысла объявлять метод equals и toString () в интерфейсе, потому что они есть у каждого объекта. Вы не получите ошибку компиляции, если вы ее не реализовали.

Кроме того, метод equals всегда должен иметь сигнатуру логических равных ( Object other), потому что только тогда он переопределяет метод Object и будет вызываться корректно в любое время.

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