仅允许某些类访问私有变量的接口

时间:2014-03-06 04:07:55

标签: java inheritance interface

我对接口/继承更加困惑。这是示例情况。汽车类有私人会员,装备。跑车和面包车延长了汽车。他们都是汽车。但是,只有跑车应该能够设置齿轮。面包车不能改变装备(跟我一起)。

然后有一个接口,IGearChangable。跑车实现了这个界面。那么sports Car类有一个名为setGear的方法。我的问题是,我如何获取装备?如果我在汽车保护中做任何事情,即使货车不能更换装备,仍然可以使用改装装备的能力。

public class Car
{
    private int gear;

    public Car()
    {
        gear = 1;
    }
    //Any setGear function here would be available to GearChangable and Non
}

public class SportsCar extends Car implements IGearChangable
{
    public SportsCar()
    {
        super();
    }

    public void setGear(int gear)
    {
         //How do I access gear?
    }
}

public class Van extends Car
{
    public Van()
    {
        super();
    }

    //This class should have NO access to change gear
}

public interface IGearChangable 
{
    public void setGear(int gear);
}

我觉得我错过了一个概念。跑车应该有自己的私人装备吗?这对我来说似乎也不对。

3 个答案:

答案 0 :(得分:2)

创建传输接口

interface Transmission  {
   int getGear();
}
interface Car  {
}

然后创建一个抽象基类:

public abstract class AbstractCar implements Car  {
   //...
}

public abstract class AbstractManualCar implements Car, Transmission  {
   private int gearNum;
   public AbstractManualCar()  {
      gearNum = 0;
   }       
   public void setGear(int gearNum)  {
      this.gearNum = gearNum;
   }
   public int getGear()  {
      return  gearNum;
   }
}

然后Van延伸AbstractCarSportsCar延伸AbstractManualCar

正如我七岁的孩子所说的那样,“容易腻,柠檬挤压。” :)

答案 1 :(得分:1)

为什么不简单地将“齿轮”字段移入SportsCar?如果货车无法改变档位值,为什么它应该有一个油田?

如果Van必须具有只读齿轮(在您的情况下始终为“1”),请在Car类中定义 abstract 方法getGear()。 SportCar实现它并返回字段的值。 Van实现它并简单地返回“1”。

答案 2 :(得分:0)

可以在课堂外访问声明为private的变量。如果班上有公共getter方法。

在car类中创建get方法以获取齿轮的私有变量的值

public int getgear(){

return gear;
}