我想创建一组非常相似的类,并且可以转换为其他类型。我的想法是我将创建一个Interface对象并通过基类实现它。然后创建从我的基础继承的其他类。然后,我可以使用Interface来处理公共(基础)方法,并将BASE对象中的对象转换为自定义类型。
interface ImyInterface {
}
public class MyBase : ImyInterface {
}
public class MyCustom1 : MyBase {
}
public class MyCustom2 : MyBase {
}
// in helper class
public static MyBase GetGeneralOjbect() {
// get a generic base object
return new MyBase();
}
// How I'm trying to use this
MyCustom1 obj = GetGeneralOjbect() as MyCustom1;
除了转换对象语句之外,这似乎有效。即使静态助手GetGeneralOjbect返回一个好的MyBase对象,MyCustom1也始终为null。也许这不可能做到,或者我没有正确地做到这一点。任何意见都将不胜感激。
答案 0 :(得分:3)
这是因为您可以将MyCustom1
或MyCustom2
投射到MyBase
,但不一定是另一种方式。
当您通过MyBase
创建MyBase b = new MyBase();
时,b
是MyBase
而不是MyCustom2
,因此将b
投射到{{} 1}}会失败。
可以做的是:
MyCustom2
无法做的是:
MyBase b = new MyCustom2();
MyCustom2 c = b as MyCustom2();
答案 1 :(得分:1)
基本上你可以建立一个继承链而不是它。说你有以下课程heirarchy:
public class A {
}
public class B : A {
}
public class C : B {
}
如果您实例化了类型B的新实例,则可以将其强制转换为A而不是C.
答案 2 :(得分:1)
“as”关键字表示“如果这个静态类型为MyBase的对象具有MyCustom1的运行时类型,那么将它静态地返回给我作为MyCustom1;否则,给我一个空引用”。您正在投射的对象具有运行时类型MyBase,而不是MyCustom1,这就是您获得空引用的原因。
答案 3 :(得分:0)
您是否考虑过使用工厂模式?
答案 4 :(得分:0)
只要预期MyCustom1
的实例,就可以使用MyBase
的实例,但在预期MyBase
时无法使用MyCustom1
。