簡體   English   中英

無論如何基於.NET或Java模式的子類型“字符串”?

[英]Anyway to subtype “string” based on pattern in .NET or Java?

假設我想創建一個可以接受的ReadFile方法

HTTP://.../url

要么

C:\\ LOCALFILE

我想要的是我的方法的用戶表達(即使它恰好是我自己的第一個),這應該是現代編程語言的目的。

同時我不希望在實現中使用過程,而是在編譯時使用類型檢查更多OOP,就像真正的類型一樣。

如果我能以某種方式定義“字符串”子類型http或c:那么會很好...

代替

ReadFile(String aString) 

並測試String類型為http或local

我可以使用多態和定義

ReadFile(SubtypeString1 aString) 

ReadFile(SubtypeString2 aString) 

其中ReadFile將繼續接受普通字符串,但會在后台由.net運行時觸發檢查與上面定義相關的2類。

有沒有辦法在C#或Java中以某種方式執行此操作?

好吧,你不能在C#或Java中繼承String。 它是最終的(Java)和密封的(.NET)以防止子類化。

當然,您可以創建自己的類來包裝字符串,然后創建重載。 但是,重載解析通常在編譯時而不是執行時執行,因此它不會執行您想要的操作(“在后台觸發”)。 最接近的等價物是在C#4中使用動態類型在執行時執行重載解析......但我仍然認為這不是一個好主意。

目前還不清楚你到底要做什么。 您可能想要創建某種Resource基類型,從String創建Resource的工廠方法,然后是兩個子類 - 例如FileResourceWebResource分別表示本地文件和Web資源。 然后,您將在基類中放入適當的抽象方法,並在每個子類中實現它們。

編輯:你的問題要求一個富有表現力的答案 - 這就是這個問題。 您正在將“解決此字符串的含義”與“從資源中讀取數據”分開,這樣您就可以在API周圍傳遞資源,清楚地表達其含義。 傳遞一個簡單的字符串,它可以是任何東西 - 包括既不是文件名也不是URL的東西。

我想你想要一個工廠來分析你的輸入字符串,然后根據字符串的樣子創建文件讀取對象:

class FileReader { }
class UrlFileReader : FileReader { }
class LocalFileReader : FileReader { }

class FileReaderFactory
{
   public FileReader Create(string uri)
   {
      if(IsUrl(uri))
      {
         return new UrlFileReader();
      }

      if(IsLocalFile(uri))
      {
         return new LocalFileReader();
      }

      return FileReader();
   }
}

或之后喬恩的想法,你可能會返回一個Resource可能被傳遞給你的讀者級。

不,除了:

DIY多態性:

 public void readFile(String s) {
     if( s.matches(HTTP_REGEXP) ) readFileFromHTTP(s);
     else if( s.matches(FILE_REGEXP) ) readFileFromLocal(s);
     else ...
 }

 private void readFileFromHTTP(String s) {...}
 private void readFileFromLocal(String s) {...}

您可以使用應該用於此特定目的的String包裝器類,這可能會使您的實現更容易,也更不容易出錯。

在Java中,這將是java.io.File和java.io.URL類:

public void readFile( URL url )
{
...
}

public void readFile( File file )
{
...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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