[英]Invoke Method of Subclass with Matching Regex
我試圖基於與類的regex()
方法匹配的返回值調用方法convert()
,這兩個方法都在下面的基類中定義:
public abstract class BaseClass {
public abstract BaseClass convert(String value);
public abstract String regex();
}
我也有幾個具有這些方法的實現的子類。 我希望能夠執行以下方法(將駐留在BaseClass
):
public static BaseClass parseNew (String value) {
// I use a switch statement to convey the idea of what I want to
// do, not for functionallity. Any non-constant cases raise
// compiler errors.
switch (value) {
case new Subclass1().regex():
return new Subclass1().convert(value);
case new Subclass1().regex():
return new Subclass1().convert(value);
// Repeat for all known and possibly unknown subclasses
}
}
我當時正在考慮使用反射,但是我對此非常熟練。 如何使用反射或其他概念來獲得此功能?
這種設計的問題是它破壞了抽象(了解子類的基礎),這使它成為一個可怕的想法。
關於抽象的一些知識:
抽象是向用戶隱藏實現細節的過程。 Оnly功能將提供給用戶。
取而代之的是,您可以創建一個包含該邏輯的不同類,並將其作為某種工廠 。
基本上,您提供了一個公開操作的基礎 。 該基礎位於繼承樹的頂部。 通過它您可以提供實現。 在不了解這些實現的基礎上,它們沒有連接,它們是特定的。 因此, 基類應該知道sub存在,這只會導致代碼被耦合,並使它變得非模塊化且難以維護。
這主要與創建干凈代碼有關 。
因此,快速瀏覽一下工廠...我們想要一個將接收value
並將其解析為BaseClass
實例的對象。
public class Parser {
private final Collection<BaseClass> implementations;
public Parser(Collection<BaseClass> implementations) {
this.implementations = implementations;
}
public BaseClass parseNew(String value) {
for (BaseClass implementation : implementations) {
if (implementation.regex().equals(value)) {
return implementation.convert(value);
}
}
throw new IllegalArgumentException("unsupported value");
}
}
上面的Parser
類是一個工廠 ,其中包含一組已知的BaseClass
實現。 使用這些,可以確定需要哪種實現。
這是一個非常動態的實現。 您可能希望使用已知實現一次創建該工廠的實例,然后在任何地方使用它。
一般設計說明
BaseClass.convert
返回BaseClass
的事實也有些怪異。 我希望它能返回其他東西。 BaseClass
似乎是一個轉換器 ,而convert
應該返回一個值 。
但這只是一般性說明。
一些閱讀資源:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.