1

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

4

5 回答 5

3

这是因为您可以将 aMyCustom1MyCustom2to强制转换为MyBase,但不一定是其他方式。

当您创建MyBaseviaMyBase b = new MyBase();时,b是 aMyBase但不是 a MyCustom2,因此转换bMyCustom2将失败。

可以做的是:

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

不能 做的是:

MyBase b = new MyCustom2();
MyCustom1 c = b as MyCustom1();
于 2012-04-04T14:29:47.393 回答
1

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

public class A {
}

public class B : A {
}

public class C : B {
}

如果你实例化了一个 B 类型的新实例,你可以将它强制转换为 A 而不是 C。

于 2012-04-04T14:35:06.137 回答
1

“as”关键字表示“如果这个静态类型为 MyBase 的对象的运行时类型为 MyCustom1,则将其返回给我,静态类型为 MyCustom1;否则,给我一个空引用”。您正在转换的对象的运行时类型为 MyBase,而不是 MyCustom1,这就是您获得空引用的原因。

于 2012-04-04T14:38:53.857 回答
0

您是否考虑过使用工厂模式?

于 2012-04-04T14:32:48.243 回答
0

可以在期望的实例MyCustom1时使用实例MyBase,但MyBase不能在MyCustom1期望时使用。

于 2012-04-04T14:33:09.023 回答