繁体   English   中英

有没有一种优雅的方法可以根据用于创建该对象的构造函数来更改类的对象可以使用的方法/变量?

[英]Is there an elegant way to change what methods/variables an object of a class can use based on the constructor used to create this object?

因此,例如,当用一个不带参数的构造函数构造该对象时,该对象能够/“允许”使用该类中定义的方法的某些子集,并且使用不同的构造函数创建该对象时(例如带有参数的示例)可以/允许使用该类中定义的方法的不同子集。

这些是想到的概念性解决方案:

  1. 在构造函数中使用反射来修改其类方法的可见性/可访问性。 (问题是EURGH ...反射

  2. 在构造函数中设置像isAllowedToUseMethodA这样的布尔标志,以标识允许对象使用哪些方法。 (问题是布尔检查将产生的开销,并且标记为不可访问的方法仍然对对象可见并且可以尝试执行)

房间里最明显回答是“制作2个不同的班级”。 而且我了解到,我很好奇,如果我想在一个班级中做到这一点,是否有一种优雅的方式来做到这一点?

选项1和2都有很多问题,但是幸运的是,有一种简单而合理的方法可以精确地完成您想要的操作:

使用继承。

定义对象的不同版本,这些版本都继承一个公共的(可能是抽象的)核心。

然后,使用工厂方法根据调用的工厂方法构造每个版本的正确版本。

您实际上不能使用其他方法子集,但是可以通过策略模式进行某种“切换”。

例如,为构造函数设置不同的策略:

public class XXX() {
    method1Strategy = new method1Strategy1();
    method2Strategy = new method2Strategy1();
}

public class XXX( ... ) {
    method1Strategy = new method1Strategy2();
    method2Strategy = new method2Strategy2();
}

然后在您的方法中执行具体策略:

public Object method1(...) {
   return method1Strategy.execute(...)
}

public Object method2(...) {
   return method2Strategy.execute(...)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM