来自接口的C#铸造类型
问题描述:
我想创建一组非常类似的类,并且可以将其转换为其他类型。我的想法是,我会创建一个接口对象,并通过一个基类来实现它。然后创建从我的基地继承的其他类。然后,我可以使用接口来处理通用(基本)方法,并将对象从BASE对象转换为自定义类型。来自接口的C#铸造类型
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。也许这不能完成,或者我没有正确地做。任何输入将不胜感激。
答
这是因为您可以将MyCustom1
或MyCustom2
投射到MyBase
,但不一定是其他方式。
当你创建一个MyBase
通过MyBase b = new MyBase();
,b
是MyBase
但不是MyCustom2
,所以铸造b
到MyCustom2
将失败。
什么你可以做的是:
MyBase b = new MyCustom2();
MyCustom2 c = b as MyCustom2();
什么你不能做的是:
MyBase b = new MyCustom2();
MyCustom1 c = b as MyCustom1();
答
你有没有考虑使用工厂模式?
答
无论何时需要MyBase
的实例,都可以使用MyCustom1
的实例,但在预期MyCustom1
时不能使用MyBase
。
答
基本上,你可以建立一个继承链,但不能放弃它。假设你有以下类层次结构:
public class A {
}
public class B : A {
}
public class C : B {
}
如果实例B类的新实例,你可以将它转换为A,但不是C.
答
的“作为”关键字说:“如果这个对象,它是静态类型为MyBase具有MyCustom1的运行时类型,然后将其返回静态类型为MyCustom1;否则,给我一个空引用“。您正在投射的对象具有MyBase的运行时类型,而不是MyCustom1,这就是您获取空引用的原因。
我怀疑是这种情况。以为我会试试这个特殊的情况,但我不确定它是否正确。感谢您的输入。 – 2012-04-04 14:43:45
那么......你*可以*做到这一点......它只会在运行时崩溃并烧毁。 'MyCustom1 c = new MyCustom2();即使有明确的转换,也不会编译。 – Servy 2012-04-04 14:47:13
是的,你*可以*做到这一点,但随着OP注意到,第二次演员的结果将是'空'。 – 2012-04-04 15:07:48