[英]Anyway to subtype “string” based on pattern in .NET or Java?
假設我想創建一個可以接受的ReadFile方法
要么
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
的工廠方法,然后是兩個子類 - 例如FileResource
和WebResource
分別表示本地文件和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.