2012-04-04 245 views
1

我想创建一组非常类似的类,并且可以将其转换为其他类型。我的想法是,我会创建一个接口对象,并通过一个基类来实现它。然后创建从我的基地继承的其他类。然后,我可以使用接口来处理通用(基本)方法,并将对象从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。也许这不能完成,或者我没有正确地做。任何输入将不胜感激。

回答

3

这是因为您可以将MyCustom1MyCustom2投射到MyBase,但不一定是其他方式。

当你创建一个MyBase通过MyBase b = new MyBase();bMyBase但不是MyCustom2,所以铸造bMyCustom2将失败。

什么你可以做的是:

MyBase b = new MyCustom2(); 
MyCustom2 c = b as MyCustom2(); 

什么你不能做的是:

MyBase b = new MyCustom2(); 
MyCustom1 c = b as MyCustom1(); 
+0

我怀疑是这种情况。以为我会试试这个特殊的情况,但我不确定它是否正确。感谢您的输入。 – 2012-04-04 14:43:45

+0

那么......你*可以*做到这一点......它只会在运行时崩溃并烧毁。 'MyCustom1 c = new MyCustom2();即使有明确的转换,也不会编译。 – Servy 2012-04-04 14:47:13

+0

是的,你*可以*做到这一点,但随着OP注意到,第二次演员的结果将是'空'。 – 2012-04-04 15:07:48

0

你有没有考虑使用工厂模式?

0

无论何时需要MyBase的实例,都可以使用MyCustom1的实例,但在预期MyCustom1时不能使用MyBase

1

基本上,你可以建立一个继承链,但不能放弃它。假设你有以下类层次结构:

public class A { 
} 

public class B : A { 
} 

public class C : B { 
} 

如果实例B类的新实例,你可以将它转换为A,但不是C.

1

的“作为”关键字说:“如果这个对象,它是静态类型为MyBase具有MyCustom1的运行时类型,然后将其返回静态类型为MyCustom1;否则,给我一个空引用“。您正在投射的对象具有MyBase的运行时类型,而不是MyCustom1,这就是您获取空引用的原因。