接口中的C#铸造类型

本文关键字:类型 接口 | 更新日期: 2023-09-27 18:30:04

我想创建一组非常相似的类,这些类可以转换为其他类型。我的想法是创建一个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。也许这是做不到的,或者我做得不对。任何意见都将不胜感激。

接口中的C#铸造类型

这是因为可以将MyCustom1MyCustom2强制转换为MyBase,但不一定相反。

通过MyBase b = new MyBase();创建MyBase时,bMyBase,而不是MyCustom2,因此将b强制转换为MyCustom2将失败。

可以做的是:

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

不能做的是:

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

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

基本上,你可以向上抛出继承链,但不能向下抛出。假设你有以下类继承:

public class A {
}
public class B : A {
}
public class C : B {
}

如果您实例化了一个类型为B的新实例,则可以将其强制转换为a,而不是C。

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

只要需要MyBase的实例,就可以使用MyCustom1的实例,但如果需要MyCustom1,就不能使用MyBase