簡體   English   中英

匹配正則表達式的子類的調用方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM