在许多面向对象语言(如Dart或Java )中,可以参数化传递给对象构造函数的参数。在构造函数中处理意外参数类型的最佳方法是什么?例如,在这个Dart代码段中,使用了加号运算符(+),并且假设这只在ints或字符串的上下文中是有意义的:
class Wrap <T> {
OK;
factory Wrap (T a) {
if (a is String) print ("Type is String");
else if (a is int) print ("Type is int");
return Wrap ._ (a);
}
Wrap ._ (this.a);
}
main () {
/ *
var obj = Wrap <Map <int, String >> (<int, String> {0: '1'});
var obj = Wrap <String> ('2');
var obj = Wrap <int> (2);
* /
print (obj.a + obj.a);
}我对OOP处理这个问题的方法很感兴趣(如果可能的话,特别是在Dart和Java中)。
我考虑过的一些想法是:
发布于 2021-01-02 02:04:51
正如@评论的那样,当前处理泛型类的类型参数中的意外类型的最好和最安全的方法是抛出异常。
虽然这并不妨碍实例的创建,但异常已经足够了,因为它通知程序员某些地方出错了,只给了他一个选项来处理错误/异常,否则程序就会终止。
以下是上文所述的一个例子:
class Wrap<T> {
T a;
factory Wrap(T a) {
if (!(T == String || T == int))
throw(Error_Wrap("Invalid type ${T}"));
return Wrap._(a);
}
Wrap._(this.a);
}
class Error_Wrap extends Error {
String error;
Error_Wrap(this.error);
@override
String toString() => error;
}
main () {
var obj;
try {
obj = Wrap<Map<int, String>>(<int, String>{ 0 : '2'});
} on Error_Wrap catch(e, s) {
print("${e}\n${s}");
return;
}
print(obj.a + obj.a);
}谢谢@AnilRedshift编辑并重新打开这个问题。
https://stackoverflow.com/questions/65419447
复制相似问题