2011-04-07 78 views
1

下面是关于接口和类的一些问题。java中的接口,类和构造函数

我正在尝试通过名为IPAddressString的类为名为IPAddress的接口执行一个实现。 Ipadress包含四个部分。

我正在写一个名为掩码的方法,它掩盖了给定的地址。掩码 操作是对地址的所有四个部分按位和'操作。您通过我写的名为getOc​​tet的方法获得了所有这四个部分。 (你可以在下面看到)。

好的,所以我需要掩盖我的this.IpAdress,它与我一起写了一个新的通用IPAddress。

写封面时我面临一个问题。我计算了4个与他们相同的整数,我想返回一个新的IPAddress类型。为了做到这一点,我需要使用我的constructer返回 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

'IPAddressString'需要*实现*'IPAddress' – Tedil 2011-04-07 20:49:10

+0

您是否试过实现IPAddress? – RedSoxFan 2011-04-07 20:50:05

+0

@泰迪尔:是的,我写了相反的吗? – 2011-04-07 20:50:08

回答

5

您可以在IPAddressString中实施IPAddress。虽然你在IPAddressString类中实现了IPAddress接口的所有方法,但你并没有告诉编译器[这显然无法猜测你的意图]。

改变你的类的定义:

class IPAddressString implements IPAddress 

这应该解决的转换问题。

现在这行:因为层级建立

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

不会给你的问题。你可以平静地返回n1

+0

谢谢。现在它工作。 – 2011-04-07 20:56:47

1

简单的公共类IPAddressString实现IPAddress将解决问题。

是跃升到我的眼睛另一个建议:

它没有任何意义申报equals和toString()方法的接口,因为每一个对象已经有他们。如果你没有实现它,你将不会收到编译错误。

此外,equals方法必须始终有签名布尔等于(对象等),因为只有这样,它覆盖对象的方法,将在所有的时间正确调用。