【问题标题】:Use a subclass object to modify a protected propety within its superclass object使用子类对象修改其超类对象中的受保护属性
【发布时间】:2011-02-13 14:55:50
【问题描述】:

对不起,我没有为我的 Java 问题想出更好的版本。 我现在使用 Java 版本:1.6.0_18 和 Netbeans 版本:6.8

现在回答问题。

我所做的是创建了一个只有一个受保护的 int 属性的类,然后我创建了一个公共方法来将 int 属性设置为给定值。 然后我创建了该类的一个对象,并使用所述公共方法将 int 属性设置为 5。 现在我需要您的帮助来创建另一个类,该类将采用所述对象并公开其受保护的 int 属性。

我能想到的方法是创建一个子类来继承该类,然后创建一个方法来获取超类的 int 属性。我有点成功地创建了获取 int 属性的代码,但现在我不知道如何使用这个新的子类来引用超类的对象。

这是我目前上过的两门课:

公开课A
{
  受保护的 int iNumber;

  公共无效 setNumber ( int aNumber )
  {
    iNumber = aNumber;
  }
}
公共类 B 扩展 A
{
  公共 int getNumber()
  {
   返回超.iNumber;
  }
}

我创建了一个 'A' 的对象,并使用它的方法将其属性设置为 5,如下所示:

一个 objA = 新的 A(); objA.setNumber ( 5 );

现在我想创建一个“B”对象来输出存储在“objA”属性中的 int。 我试过运行这段代码:

B objB = (B) objA; String aNumber_String = String.valueOf(objB.getNumber()); System.out.println(aNumber_String);

但我得到了错误:“java.lang.ClassCastException”在第一行

 B objB = (B) objA; 

请问有没有做我想做的事情?

附:我希望使这个想法可行,因为我不想通过给它一个 getter 方法来编辑 A 类(除非我别无选择)。

P.P.S 另外,我知道公开属性而不是将其设为私有并使用公共 setter / getter 方法是一个“坏”主意,但我喜欢这种方式:)。

编辑:添加代码标签

【问题讨论】:

    标签: java object subclass superclass


    【解决方案1】:

    为了线

    B objB = (B) objA;
    

    A 类的对象不是B 类的对象,因此不允许转换。

    AB 之间的类关系是,B is-a A,(因为类B 扩展了A),但逆不能在这种情况下说。

    以以下为例,其中存在以下内容:

    • Animal
    • Dog扩展Animal

    在上面的示例中尝试将Animal 转换为Dog

    Dog dogObject = (Dog)animalObject;  // Not allowed.
    

    不一定是这种情况,因为并非所有Animals 都是Dogs——据我们所知,animalObject 可能是类Cat 的一个实例,它扩展了Animal,它绝对不是Dog

    【讨论】:

    • 我喜欢这个比喻,我明白为什么它现在不起作用了,嗯。谢谢你:)
    【解决方案2】:

    你不能将 A 对象强制转换为 B。如果你想调用 getNumber,你必须有一个真正的 B 对象:

    B objB = new B();
    objB.setNumber ( 5 );
    System.out.println( objB.getNumber() );
    

    不需要强制转换。

    【讨论】:

    • 我很害怕,我猜A类的对象现在已经没用了。谢谢你:)
    【解决方案3】:

    正如其他人所说,由于它们的关系,您不能将 A 对象强制转换为 B。我要补充的是,听起来您确实只有一个类,但是在某些情况下,您希望其他一些对象无法读取该数字的值。我会说这更好地服务于界面。将接口定义为只有 setNumber(int) 方法。将类定义为同时具有 getNumber() 和 setNumber(int) 方法,并实现您的“setter”接口。然后,无论您有一个接受 A 对象作为参数的方法,都将其更改为接受您的接口。

    这将允许您拥有不允许获取对象值的代码,但通过仅定义一个类来简化您的代码。

    【讨论】:

    • 我喜欢这个主意,我可能最终会实际使用它。谢谢你:)
    猜你喜欢
    • 2013-03-25
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 2018-10-17
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多