2017-04-19 91 views
0

假设用户为您提供了一个电话号码(作为类PhoneNumber的一个对象或它的一个子类),他首先声明它是手机还是手机一个家庭电话。在主程序中,您应该能够知道(之后的方式)是指移动电话还是家庭电话。2具有相同内容的Java类(函数,变量等)

下面是你不能做什么:

  1. 您不能检查数字,找出因为用户实际上是能够给任何号码,他希望(他可以给9123的室内电话)。
  2. 您不能在任何指示答案的变量(在类或主程序中)。

如果您制作两个不同的类来扩展PhoneNumber类并且具有完全相同的内容(在我的示例中它们实际上是空的,但在我真正的问题中它们不是)?如果你这样做,你可以创建这些类的对象,并在主程序中使用instanceof,但是我想知道是否有另一种解决方案,看起来更好。

编辑:我看起来有什么不对,因为我们实际上只知道找出一个对象的类,所以2个类的内容相同,而不是instanceof。

例子:

public class PhoneNumber{ 
    private int Number; 

    public PhoneNumber(int Number){ 
      this.Number = Number; 
    } 
} 

public class Mobile extends PhoneNumber{} 

public class HousePhone extends PhoneNumber{} 
+0

在此先感谢并对任何错误感到抱歉,这是我的第一个问题 –

+0

“您不能在任何指示答案的变量(在课程或主程序中)”。 < - 为什么不呢? –

+1

您可以改为扩展'PhoneNumber'一次,然后添加一个枚举来指示它是什么类型的数字,例如:'public enum PhoneNumber.PhoneType {MOBILE,HOME}'并存储它的一个成员。 – CollinD

回答

0

既然你不能创建在主程序任何变量,你的选择是明显有限

您可以使用OOP概念来解决这个问题,正如您尝试的那样。并且您不需要复制内容,因为从已经具有所有内容的同一父节点继承,将自动授予它们访问内容的权限。这包括除指定为私人的所有属性和字段。为了解决这个问题,你可以保护这些属性。

以下应为你工作:

public abstract class PhoneNumber 
{ 
    private int Number; 


    public PhoneNumber(int Number) 
    { 
     this.Number = Number; 
    } 

    protected int getNumber() 
    { 
     return Number; 
    } 

    public void doSmthnWithNumber(); 
} 

public class Mobile extends PhoneNumber 
{ 
    @Override 
    public void doSmthnWithNumber() 
    { 
     int Number = getNumber(); 
     // Do whatever you want with mobile numbers 
    } 
} 

public class HousePhone extends PhoneNumber 
{ 
    @Override 
    public void doSmthnWithNumber() 
    { 
     int Number = getNumber(); 
     // Do whatever you want with HousePhone numbers 
    } 
} 

所以用这个,你知道有一个在你的代码没有冗余,你不重复自己,你是以下SOLID原则。使其更容易在眼睛上,更好地让其他开发人员了解你。 也可以对PhoneNumber进行更改,它将反映在子类中。

希望我已经能够解决您的问题。

+0

感谢您的回答。听起来像个好主意,我会问我的老师 –

+0

@ staa99我想你忘了在方法签名中添加关键字*'abstract' *。 'public void doSmthnWithNumber();' –

+0

你说得对,我忘了添加摘要。感谢您为我指出。 – staa99

1

你不能让任何变量(在类或在主程序),指出了答案。但是你可以制作一个获取类型的方法。在您的课程MobileHousePhone中创建一个方法,返回某种enum。 方法应该是基类中的抽象方法。

我认为这比instanceof更好。

+1

我的问题是那些2个课程的内容完全相同。我不知道它是否显示为我的程序不好。感谢您回答 –

0

替代instanceof,您可以使用isAssignableFrom

PhoneNumber phoneNum = new Mobile(123); 

    if (phoneNum.getClass().isAssignableFrom(Mobile.class)) { 
     Mobile mobile = (Mobile) phoneNum; 
    } else { 
     HousePhone housePhone = (HousePhone) phoneNum; 
    } 
+0

但是我仍然需要创建这2个相同的课程。感谢您回答 –

+0

这个解决方案最好的解决方案是什么?如果你想要的只是'instanceof',那么'isAssignableFrom'是一个完整的矫枉过正,在代码上做得不那么冗长,更复杂而没有任何明显的好处。你可以用'isInstance'来代替,这对于这个目的来说是完全足够的。 – Paul

+0

也许我没有写那么好。 Instanceof实际上是我们在我的课程中知道的唯一方法,可以在对象属于特定类时回答您。对我来说有点偏离的是那些具有相同变量,函数和构造函数的类(我真正的问题当然比这个大得多) –

相关问题