不管怎样,我要将子类型设为& 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中是否有办法做到这一点?

不管怎样,我要将子类型设为& string"基于.net或Java的模式

你不能在c#或Java中子类化String。它是final (Java)和sealed (. net),以防止子类化。

当然,您可以创建自己的类来包装字符串,然后创建您的重载。然而,重载解析通常是在编译时而不是执行时执行的,所以它不会做你想做的事情("后台触发")。最接近的等效是在c# 4中使用动态类型在执行时执行重载解析……但我还是不认为这是个好主意。

我不太清楚你到底想做什么。你可能想要创建某种类型的Resource基本类型,一个工厂方法从一个字符串创建一个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();
   }
}

或者按照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 )
{
...
}