【问题标题】:C# Casting types from InterfacesC# 从接口转换类型
【发布时间】:2012-04-04 14:28:11
【问题描述】:

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

【问题讨论】:

    标签: c# class interface casting


    【解决方案1】:

    这是因为您可以将 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();
    

    【讨论】:

    • 我怀疑是这种情况。以为我会在我正在做的这种特殊情况下尝试一下,但不确定它是否正确。感谢您的意见。
    • 嗯......你可以做到......它只会在运行时崩溃和烧毁。 MyCustom1 c = new MyCustom2(); 甚至不会编译,即使有显式转换。
    • 是的,你可以做到,但正如 OP 所注意到的,第二次演员的结果将是 null
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          当需要MyBase 的实例时,可以使用MyCustom1 的实例,但是当需要MyCustom1 时,不能使用MyBase

          【讨论】:

            猜你喜欢
            • 2021-07-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-03-27
            相关资源
            最近更新 更多