Интерфейсы, классы и конструкторы в java

#java #class #interface #constructor

#java #класс #интерфейс #constructor

Вопрос:

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

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

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

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

При написании маски я столкнулся с проблемой. Я вычислил 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) amp;amp; 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 amp;amp; 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) amp; getOctet(0);
        int n1= mask.getOctet(1) amp; getOctet(1);
        int n2=mask.getOctet(2) amp; getOctet(2);
        int n3=mask.getOctet(3) amp; getOctet(3);



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

}
  

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

Спасибо.

Комментарии:

1. IPAddressString необходимо реализовать IPAddress

2. Вы пробовали реализовать IPAddress?

3. @Tedil: да, разве я писал обратное?

4. Вы вообще ничего не реализовали.

5. @RedSoxFan: Я не понимаю. Я реализую методы IPAddress с помощью IPAddressString.

Ответ №1:

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

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

 class IPAddressString implements IPAddress
  

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

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

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

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

Ответ №2:

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

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

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

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