C#-传递self对象的继承方法

本文关键字:继承 方法 对象 传递 self C#- | 更新日期: 2023-09-27 18:27:22

真正的问题出现在反射和组装补丁/挂钩上。我将举一个简单的例子来说明我的问题,而不会太难理解主要问题。

让我们想象一下我有这些基本类:

public class Vehicle
{
    public string Name;
    public string Price;
    public void DoSomething()
    {
        Main.Test(this);
    }
}
public class Car : Vehicle
{
    public int Wheels;
    public int Doors;
}

在我运行的主要代码上:

public class Main
{
    public void Start()
    {
        Car testCar = new Car()
        {
            Name = "Test Car",
            Price = "4000",
            Wheels = 4,
            Doors = 4
        };
        testCar.DoSomething();
    }
    public static void Test(Vehicle test)
    {
        // Is this allowed ?
        Car helloWorld = (Car) test;
    }   
}

好吧,问题是:

允许这种强制转换吗(在静态方法测试中)?我会失去汽车财产,但保留车辆财产吗?

万一出了问题,还有别的办法吗?

谢谢。

C#-传递self对象的继承方法

只有当传入的对象恰好是Car时,才允许将Vehicle强制转换为Car。否则会出现异常。

当类型错误时,有一种类型转换不会导致异常:

Car car = test as Car;

这永远不会抛出,但当Vehicle而不是Car时,变量car将是null。您可以添加一个if条件来测试强制转换是否成功:

Car car = test as Car;
if (car != null) {
    ...
}
Bus bus = test as Bus;
if (bus != null) {
    ...
}
Rv rv = test as Rv;
if (rv != null) {
    ...
}

然而,C#提供了一个更好的解决方案:方法重载可以完全避免强制转换。

public class Main {
    public static void Test(Car test) {
        ... // This method will be called by Main.Test(this) of a Car
    }
    public static void Test(Bus test) {
        ... // This method will be called by Main.Test(this) of a Bus
    }
    public static void Test(Rv test) {
        ... // This method will be called by Main.Test(this) of an Rv
    }
}

这是有效的,因为当您调用Main.Test(this)时,编译器知道this变量的确切类型。

是的,强制转换是允许的,并且不会"丢失"任何属性。但如果Vehicle test实际上不是Car的实例,那么您的演员阵容将抛出一个InvalidCastException

是的,这是允许的。它被命名为下行广播。

请记住,可以通过类型内省进行检查,以确定被引用对象的类型是否确实是被强制转换为的对象或其派生类型。