1. 基本原则
(1)派生类对象可以向基类对象赋值。
所谓赋值只是对数据成员赋值,对成员函数不存在赋值问题。赋值后基类对象不能访问派生类对象的属性和方法(基类中没有)。派生类的属性其实转换到基类,只是不能访问
。
//GoodsInfoDto对象转换成基类对象jbBaseDto ,属性转换到基类对象
JbBaseDto jbBaseDto = JbCommonService.postForObject(goodsReq,"url",GoodsInfoDto.class);
image.png
(2)基类的对象不能给派生类的对象赋值
因为基类对象不包含派生类的成员,无法对派生类的成员赋值。同理,同一基类的不同派生类对象之间也不能赋值。
根据不能赋值的理由推理:把派生类对象赋值给基类对象,再把基类对象赋值给另外一个派生类对象,这是可以的。经过第一次赋值后,基类对象已经有类派生类对象所有属性,再把基类对象赋值给另外一个派生类对象就没问题。
2. 基类经常用于封装
经常我们需要对公共业务进行封装,基类作为参数,或者作为返回值进行方法封装,特别是在接口开发中最常用,例如:
//对请求接口进行封装,基类JbBaseReq参数(调用时是派生类) ,基类JbBaseDto 返回值(实际上派生类赋值过)
public static JbBaseDto postForObject(JbBaseReq jbBaseReq, String url, Class<?> clazz) {
MultiValueMap<String, String> requestEntity = new LinkedMultiValueMap<>();
String xmlRequest = XmlUtil.beanToXml(jbBaseReq);
requestEntity.add("Message", xmlRequest);
String responseContent ="";
RestTemplate restTemplate = new RestTemplate();
try
{
responseContent = restTemplate.postForObject(url, requestEntity, String.class);
}
catch (Exception e)
{
String errMsg = StringEscapeUtils.escapeJava(e.getMessage());
responseContent = "{\"rtnCode\":\"-1\",\"rtnMsg\":\"" + errMsg + "\"}";
}
Gson gson = new Gson();
return (JbBaseDto) gson.fromJson(responseContent, clazz);
}
调用方法:基类转换成派生类
GoodsReq goodsReq = new GoodsReq();
goodsReq.setHgGoodsNo("310520156160600318");
GoodsInfoDto goodsInfoDto = (GoodsInfoDto)JbCommonService.postForObject(goodsReq,"url",GoodsInfoDto.class);
网友评论