[英]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?
因此,例如,當用一個不帶參數的構造函數構造該對象時,該對象能夠/“允許”使用該類中定義的方法的某些子集,並且使用不同的構造函數創建該對象時(例如帶有參數的示例)可以/允許使用該類中定義的方法的不同子集。
這些是想到的概念性解決方案:
在構造函數中使用反射來修改其類方法的可見性/可訪問性。 (問題是EURGH ...反射 )
在構造函數中設置像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.