在c#中将对象强制转换为子类

本文关键字:转换 子类 对象 | 更新日期: 2023-09-27 18:18:12

我还没有找到一个关于c#的帖子。有什么办法可以做到这一点吗?

class parent {
    public parent() { }
}
class child : parent {
    public child() { }
}
class Program {
    static void Main(string[] args) {
        parent p = new parent();
        child c = (child)p;  
    }
}

我想这样做的原因是添加一些方法的对象,是通过调用一个函数(UIGraphics.GetCurrentContext())

在c#中将对象强制转换为子类

你不能那样做。

考虑这个例子:

class Fruit {
    // bla
}
class Banana : Fruit {
    // bla
}

以下是不可能的

Fruit f = new Fruit();
Banana b = (Banana)f;

因为不是所有的水果都是香蕉

这不可能。多态性在另一个方向上工作-使用一个派生类,就好像它是更通用的父类。

但是,可以向现有的类添加方法。这被称为扩展方法。但是,它将被添加到它要扩展的类的所有实例中。

你不能这么做。你的声明是Child继承自Parent。没有人说父母必须是孩子。

如果您使用了Parent p = new Child(),那么您的cast将是可以的。

如果你想在现有对象中添加方法,那么我认为你应该研究Extension methods,因为它们是为了扩展你不能修改的类而创建的。

基类引用引用的实例不是子类的实例。

Parent c = new child();
Parent p = new parent();
Child good = (Child )c; // OK
Child fail = (Child )p; // Throws InvalidCastException

要使转换成功,要向下转换的实例必须是要向下转换到的类的实例。

要使其工作,您必须做以下操作:

class Program {
    static void Main(string[] args) {
        parent p = new child();
        child c = (child)p;  
    }
}

您正在讨论多态性的概念。你的要求是不可能的。简单解释一下,原因就很明显了:

允许child类扩展parent类的功能,但它想…添加了大量的新方法和属性等等……childparent超集。因此,将parent转换为child会留下一部分未覆盖的超集—将没有为子元素的新成员、方法和属性定义的功能。

如果对象首先由子构造函数初始化,则只能从父类强制转换为子类。通过多态性,这在所有OOP语言中都是相同的。这里你可以看到一个例子:

class parent {
    public parent() { }
}
class child : parent {
    public child() { }
}
class Program {
    static void Main(string[] args) {
        parent p = new child();
        child c = (child)p;  
    }
}

要检查实例是否由特定的类发起,可以使用操作符:is