簡體   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