我有一个简单的继承heirarchy,MyType2
继承自MyType1
。
我有一个MyType1
,arg
的实例,作为方法的参数传入。如果arg
是MyType2
的实例,那么我想执行一些逻辑,转换实例。我的代码看起来像下面的代码。
必须创建一个新的局部变量b
感觉不雅 - 有没有办法在没有额外的局部变量的情况下实现相同的行为?
public MyType1 MyMethod(MyType1 arg)
{
if(arg is MyType2)
{
MyType2 b = arg as MyType2;
//use b (which modifies "arg" as "b" is a reference to it)...
}
return arg;
}
答案 0 :(得分:5)
请注意,“是”和“as”是重复测试; 要么使用is
,然后(一旦你知道)只是施放 - 或首先使用as
并测试null
重新解决你的问题;如果你只想做一件事 - 然后施展:
if(arg is MyType2)
{
((MyType2)arg).SomeSpecialMethod();
}
否则 - 可能是一个virtual
方法(在基类型上),或者只是将逻辑重构为另一个方法,所以你有:
if(arg is MyType2)
{
StuffThatTakesType2((MyType2)arg);
}
但 persoanlly ,我只是使用额外的变量:
MyType2 whatever = arg as MyType2;
if(whatever != null) {
whatever.Foo = 123;
whatever.Bar();
}
答案 1 :(得分:2)
没有;你需要创建一个单独的变量。
Also, your code performs more casts than necessary; it would be a little bit faster like this:
MyType2 b = arg as MyType2;
if(b != null)
{
//Use b
}
答案 2 :(得分:1)
我想说选项1是将所有修改代码(您的注释行)作为MyType2的函数,然后对其进行(arg as MyType2).Foo()
。
选项2是在MyType1上实现MyMethod,在MyType2中实现覆盖,只需调用它而不用担心。 MyType1实现可能什么都不做,这不是最好的设计。
编辑:技术上不违反LSP,因为这只适用于这种情况的反面(MyType2不应该破坏MyType1的行为)。