Import 使用io或http的Dart类

Import 使用io或http的Dart类,import,dart,Import,Dart,我想创建一个处理Sockets的类层次结构。我有两个类,为了通用,让我们称它们为A和BA是B扩展的超类 下面是一个使用dart:io的示例: //a.dart 导入“dart:async”; 导入“dart:io”; 甲级{ 未来socketStuff(字符串cmd){ Completer com=新的Completer(); Socket.connect(“localhost”,5555)。然后((Socket){ socket.write(cmd); socket.listen((数据){

我想创建一个处理
Sockets
的类层次结构。我有两个类,为了通用,让我们称它们为
A
B
A
B
扩展的超类

下面是一个使用
dart:io
的示例:

//a.dart
导入“dart:async”;
导入“dart:io”;
甲级{
未来socketStuff(字符串cmd){
Completer com=新的Completer();
Socket.connect(“localhost”,5555)。然后((Socket){
socket.write(cmd);
socket.listen((数据){
String dataStr=新字符串。fromCharCodes(数据);
com.complete(dataStr);
});
});
返回com.future;
}
}
//b.dart
导入“a.dart”;
类B扩展了{
未来的doStuff(){
//调用一个方法,该方法处理套接字,但实际上并不知道
//它。
退回袜子材料(“doStuff”);
}
未来的更多{
//另一种类似于上面的方法。
退回袜子材料(“moreStuff”);
}
}
问题是我希望能够在命令行应用程序和web应用程序上使用它。类
A
要求我使用
dart:io
库或
dart:http

我想出了两种方法来解决这个问题,但这会增加相当多的复杂性。希望这会很清楚

  • 创建一个名为
    I
    的接口。拥有
    A
    和一个新类
    A2
    ,实现
    I
    <代码>A将用于命令行应用程序,而
    A2
    将用于web应用程序。问题是创建类
    B
    的对象稍微复杂一些,因为
    B
    必须在其构造函数中采用
    A
    A2

  • 创建一个名为
    I
    的接口。有一个抽象类
    A
    ,它有一个所有共享方法的列表,并实现
    I
    ,而不实际实现任何东西。然后有两个名为
    B
    B2
    (一个用于命令行,一个用于web)的类扩展
    A
    ,并实现
    I
    中缺少的方法。这个选项在很大程度上与我已有的相反,引入了一个接口


我认为第二种选择更好,但是其他人对如何做到这一点还有其他想法吗?

如果我理解正确,我会建议第三种解决方案(其他解决方案也是可能的)。听起来您的B类将是一个管理所有逻辑的助手类,因此它应该包含一个“I”成员,可以使用io中的A1和控制台中的A2进行实例化

下面是一个具体的示例,其中a是一个简单的HttpFetcher接口,用于从url获取字符串

//ihttp.dart
图书馆ihttp;
导入“dart:async”;
抽象类IHTTP蚀刻机{
未来的getString(stringuri);
}
浏览器实现

//http\u browser.dart
图书馆http_浏览器;
导入“dart:html”;
导入“dart:async”;
输入“ihttp.dart”;
类HttpBrowser实现IHttpFetcher{
@凌驾
未来getString(字符串uri){
返回HttpRequest.getString(uri);
}
}
控制台实现(此处不确定是否正确处理错误)

//browser\u console.dart
图书馆http_控制台;
导入“dart:io”;
导入“dart:async”;
输入“ihttp.dart”;
类HttpConsole实现IHttpFetcher{
HttpClient=新的HttpClient();
@凌驾
未来getString(字符串uri){
var completer=new completer();
client.getUrl(Uri.parse(Uri))
.然后((HttpClientRequest请求)=>request.close())
.然后((HttpClientResponse响应){
StringBuffer主体=新的StringBuffer();
回答,听(
(数据)=>body.write(新字符串.fromCharCodes(数据)),
onDone:()=>completer.complete(body.toString()),
onError:(e)=>completer.completeError(e));
})
.catchError((e){
完成者。完成者错误(e);
});
返回completer.future;
}
}
您提供的“B”类不依赖于io或浏览器(并且不能同时依赖于两者)和提供程序帮助程序函数

//B.dart
图书馆B;
导入“dart:async”;
输入“ihttp.dart”;
B类{
IHTTP蚀刻机取数器;
B(这个.fetcher);
Future getGoogleCom()=>fetcher.getString(“http://www.google.com");
未来的getHtml5Rocks()=>fetcher.getString(“http://updates.html5rocks.com");
}
您将在控制台应用程序的主界面中根据需要实例化B

//控制台版本
导入“http_console.dart”;
输入“B.dart”;
B=新的B(新的HttpConsole());

//浏览器版本
导入“http_browser.dart”;
输入“B.dart”;
B=新的B(新的HttpBrowser());
在您共享的源代码中,您可以调用B helpers

b.getGoogleCom().then((字符串内容){
印刷(内容);
});

祝你好运

这是我试图首先解释的解决方案。不过,你显然描述得好多了。谢谢我唯一不喜欢的是Main的用户必须在构造函数中传入一个对象。