假设我有班级Person
。一个人可以有年龄或汽车。仅当用户使用构造函数getCar()
时,我才想让方法Person(int age, boolean hasCar)
可供用户使用。因此,如果他使用Person(int age)
创建了一个Person对象,那么方法getCar
就不可访问。有没有办法做到这一点?即隐藏getCar()
方法。我想在不使用继承的情况下这样做。
答案 0 :(得分:3)
不,这是好的事情。
可能调用Person.car()
的代码不一定在编译时知道 如何在运行时构建Person 。 Person可能是由与另一个源文件,另一个包或另一个库分开编译的代码创建的。
对Person.getCar()
所做的事情,当此人没有车时,是以下之一:
或者,如果您允许继承,则可以同时拥有Person
类和PersonWithCar
类,并使用instanceof
来区分它们。但是,如果您使用多个HAS-A属性来遵循此方法,它会很快爆炸成许多类。
答案 1 :(得分:2)
简短的回答:你不能,你甚至不应该尝试。
当您调用类的构造函数时,您已经选择了要实例化的对象类型。之后更改对象/类是 - 如果可能的话 - 只是一个肮脏的黑客。肮脏的黑客应该永远是最后的手段。
典型的实现你可能想要的方法是拥有两个类Person
和AdultPerson
,后者是前者的子类,只有第二个类拥有getCar()
方法。
然后,您可以使用factory pattern创建Person
或AdultPerson
个对象,具体取决于此人的年龄。
Person
转换为AdultPerson
的问题。 }。
在hasCar()
课程中没有getCar()
,canHaveCar()
,Person
并简单地返回null
或提出如果未成年人调用getCar()
,则会出现异常吗?
答案 2 :(得分:1)
首先,这绝对不是处理这个问题的标准方法。通常,建议将是两件事之一。任何一个人都有能力持有对汽车的引用,或者有一个Person的子类(比如CarOwner)知道汽车,但仍然是人的实例
但是说,你可以隐藏基于构造函数的方法吗?可以通过反射获取实例,找到所需的方法,并在运行时更改方法的可见性。虽然这只是头脑风暴而不仅仅是一个答案,但它可能在这样做的可见性变化(如果JVM甚至允许它)将适用于该类的所有实例。
另一个选项可能是在运行时基于构造函数使方法短路,这样如果使用了错误的构造函数,则总是返回null,抛出异常或类似的东西。
答案 3 :(得分:0)
如果您描述它的方式不可能,如果hasCar为false,您可以使getCar()不执行任何操作,或者无论如何都可以使用继承。