现在项目的接口返回的是基类对象,具体是创建子类也是项目的动态库封装在里面,只告诉可以在配置文件中取到具体的实例化的是那个子类。这是架构设计
这就扯淡了,你要调用的方法不在基类上,又要用基类引用调用,,这种情况你直接用子类引用获取子类对象不就好了.
1.用基类引用无法调用不存在的字段,
2.想要调用,你可以先用is判断该对象是不是子类对象,然后强转为子类引用.
3.使用反射调用 你的对象是子类对象,只是使用基类引用指向而已,并不是子类对象,所以你可以从里面反射出子类成员 多说一句,你这样做完全是错误的,你不应该这样做
还有什么问题吗?
所以我想要把基类转换成对应的子类,如使用as 。 但是我不想使用if 判断去使用as这样转换。
可以使用反射得到子类的成员,这没有问题,问题是我这样动态的把基类转换成子类对象
@TFS:
1.不判断的话你凭什么认为里面返回的是子类对象,从定义上来看你只能保证他返回一个基类对象.
2.对象是不能转换的,转换的引用.这个是基本概念问题,内存里的对象并不会真的被强转的,只是使用不同的引用指向这个对象而已.而且动态转换成子类对象,哪来的动态,子类是无数的,这种情况你怎么判断他是哪个子类?
还有什么问题?
完全违反设计原则的事情的就不要纠结啦....对象不是这样面向的,抽象不是这样抽象的,子类不是这样定义,工厂方法不是这样用的.
不知道你这样做的目的是什么,如果目的是要调用子类的方法,可以在基类声明virtual方法,在子类override,这样要调用这个子类的方法只需要用基类的引用就可以执行到子类override的方法的代码了。
你得先把p转换成Soldier Soldier s=(Soldier)p;
然后在Invoker, 你Person里面没有Soldier的方法 你p肯定是没法调用的,
这里如果要通用可以写一个扩展<T>
没看明白你想怎么做,针对下面的代码: