当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《C#-传递自身对象的继承方法》经验,为你挑选了1个好方法。

真正的问题是反射和装配修补/挂钩.我将举一个简单的例子来展示我的问题,而不是太难理解主要问题.

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

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;
    }   
}

好的,问题是:

是否允许转换(在静态方法测试中)?我会失去汽车的属性,但保留车辆属性?

如果它是错的,有没有其他方法可以做到这一点?

谢谢.



1> dasblinkenli..:

的演员Vehicle,以Car只允许当对象传入恰好是Car.否则你会得到一个例外.

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

Car car = test as Car;

这不会抛出,但是当Vehicle不是一个Car,变量carnull.您可以添加一个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
    }
}

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

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有