假设我想创建一个接受
的ReadFile方法或
C:... \ LOCALFILE
我想要的是我的方法的用户表达(即使它恰好是我自己的第一位),这应该是现代编程语言的目的。
同时我不希望在实现中使用过程,而是在编译时使用类型检查的更多OOP,如真实类型。
如果我能以某种方式定义“字符串”子类型http或c:...
,那就太好了而不是
ReadFile(String aString)
并测试String类型为http或local
我可以使用多态并定义
ReadFile(SubtypeString1 aString)
ReadFile(SubtypeString2 aString)
其中ReadFile将继续接受普通字符串,但会在后台由.net运行时触发检查与上述定义相关联的2类。
有没有办法在C#或Java中以某种方式执行此操作?
答案 0 :(得分:8)
好吧,你不能在C#或Java中继承String。它是最终的(Java)和密封的(.NET)以防止子类化。
当然,你可以创建自己的类来 wrap 一个字符串,然后创建你的重载。但是,重载解析通常在编译时而不是执行时执行,因此它不会执行您想要的操作(“在后台触发”)。最接近的等价物是在C#4中使用动态类型在执行时执行重载解析......但我仍然认为这不是一个好主意。
目前还不清楚你究竟要做什么。您可能想要创建某种Resource
基类型,从String创建Resource
的工厂方法,然后创建两个子类 - 例如FileResource
和WebResource
分别代表本地文件和Web资源。然后,您将在基类中放入适当的抽象方法,并在每个子类中实现它们。
编辑:您的问题要求提供表达的答案 - 这就是这个问题。您正在将“解析此字符串的含义”与“从资源中读取数据”分开,允许您在API周围传递资源,明确表达的含义。传递一个简单的字符串,它可能是任何 - 包括既不是文件名也不是URL的东西。
答案 1 :(得分:2)
我想你想要一个工厂来分析你的输入字符串然后根据字符串的样子创建文件读取对象:
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
。
答案 2 :(得分:1)
不,除了:
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) {...}
答案 3 :(得分:1)
您可以使用应该用于此特定目的的String包装器类,这可能会使您的实现更容易,也更不容易出错。
在Java中,这将是类java.io.File和java.io.URL:
public void readFile( URL url )
{
...
}
public void readFile( File file )
{
...
}