不管怎样,我要将子类型设为& string"基于.net或Java的模式
本文关键字:net 基于 Java 模式 quot string 我要 类型 不管怎样 | 更新日期: 2023-09-27 17:50:24
假设我想创建一个ReadFile方法它可以接受
http://.../url或
c: ' localfile
我想要的是我的方法的用户表达性(即使它恰好是我自己),这应该是现代编程语言的目的。
与此同时,我不希望实现过程if,而是希望在编译时进行类型检查,如true类型。
如果我能定义一个"string"子类型http或c:…
代替
ReadFile(String aString)
和测试字符串的类型为http或local
我可以使用多态性并定义ReadFile(SubtypeString1 aString)
ReadFile(SubtypeString2 aString)
,其中ReadFile将继续接受正常的字符串,但会在后台触发。net运行时检查与上述定义相关的2个类。
在c#或Java中是否有办法做到这一点?
你不能在c#或Java中子类化String。它是final (Java)和sealed (. net),以防止子类化。
当然,您可以创建自己的类来包装字符串,然后创建您的重载。然而,重载解析通常是在编译时而不是执行时执行的,所以它不会做你想做的事情("后台触发")。最接近的等效是在c# 4中使用动态类型在执行时执行重载解析……但我还是不认为这是个好主意。我不太清楚你到底想做什么。你可能想要创建某种类型的Resource
基本类型,一个工厂方法从一个字符串创建一个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();
}
}
或者按照Jon的想法,您可以返回一个可以传递给阅读器类的Resource
。
没有,除了:
DIY polymorhism: 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 )
{
...
}