是否可以在父类中引用子类?

Posted

技术标签:

【中文标题】是否可以在父类中引用子类?【英文标题】:is it possible to refer to child class in parent class? 【发布时间】:2018-01-06 10:21:06 【问题描述】:

这是link的后续帖子

我创建了两个类 RadAngle 和 DegAngle,后者继承自前者。由于我想避免代码重复,我让 DegAngle 继承自 RadAngle。

注意到在 RadAngle 中,我想制作

class RadAngle 
...
RadAngle toRad(const DegAngle& dang) .. do something..  // <-- child class reference
...

这可能吗?如果不是,那么用几乎相同的代码重写两个类是不可避免的吗?

EDIT01: 现在这是我修改后的代码,它不使用两个类,而是一个类和空结构。但是,我认为它会在 toRad、toDeg 中检查输入类型是否一致会产生其他问题。这是未来的工作:P

template<typename Unit, typename numT>
class Angle 
public:
    Angle() 
      AngVal = 0.0;
    
    Angle(const numT& angV) 
      AngVal = angV;
    
    void operator = (const Angle<Unit,numT>& ang1) 
      AngVal = ang1.getVal();
    
    Angle operator+(const Angle<Unit,numT>& ang1) const  return Angle<Unit,numT>(AngVal+ang1.getVal()); 
    Angle operator-(const Angle<Unit,numT>& ang1) const  return Angle<Unit,numT>(AngVal-ang1.getVal()); 
    Angle operator*(const Angle<Unit,numT>& ang1) const  return Angle<Unit,numT>(AngVal*ang1.getVal()); 
    Angle operator/(const Angle<Unit,numT>& ang1) const  return Angle<Unit,numT>(AngVal/ang1.getVal()); 

    numT getVal() const  return AngVal;;

    Angle<Unit,numT> toRad(const Angle<Unit,numT>& dang)  return dang.getVal() / 180. * M_PI;
    Angle<Unit,numT> toDeg(const Angle<Unit,numT>& dang)  return dang.getVal() / M_PI * 180.;

private:
    numT AngVal;
;

struct Radian;
struct Degree;

int main() 

   Angle<Radian,float> a(1.5);
   Angle<Radian,float> b(3.5);
   Angle<Radian,float> c = a+b;

   //std::cout << c << std::endl;
   printf("%.2f\n",c.getVal());

   Angle<Degree,float> d(45.);

   Angle<Degree,float> z = d + Angle<Degree,float>(15.);
   printf("%.2f\n",z.getVal());


   return 0;

【问题讨论】:

softwareengineering.stackexchange.com/a/243162/271425 没有回答你的问题怎么办? “以度为单位的角度”真的是一种特殊的“以弧度为单位的角度”吗?阅读您接受的答案中的链接。 @PasserBy 对于类型安全问题,我已经使用了 RadAngle 类。我正在考虑它体积小,并为我的使用快速开发。所以,我采用这种方法而不是其他方法。我已经在上一篇文章中提供了 RadAngle 类,但是当我继续使用 DegAngle 类时,我遇到了当前文章中的错误。我的主要目的是类型安全,无需向当前程序添加更多代码 @molbdnilo,我想避免在我的代码中混合使用 Degree & Radian & float/double 类型的操作,这是我现在正在修复的错误 @ShawnLe 我不明白你刚才说什么。这里的重点不就是强烈地重新输入一个数字吗?链接的帖子正是这样做的,没有任何样板,你似乎暗示有 【参考方案1】:

你不需要用相同的代码编写两个类,你可以使用一个类模板,让编译器为你“编写”代码。

类似这样的:

template<typename Unit>
struct Angle

    // Member functions ...
    float magnitude;
;

struct Deg;
struct Rad;

using RadAngle = Angle<Rad>;
using DegAngle = Angle<Deg>;

RadAngle toRadians(const DegAngle& inDegrees)

    // ...


DegAngle toDegrees(const RadAngle& inRadians)

    // ...

【讨论】:

谢谢你,molbdnilo!这是我喜欢的方法。我不需要对我当前的代码进行太多修改,而且它工作得很好。这些空结构是否也称为幻像类型?

以上是关于是否可以在父类中引用子类?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在父类中有一个“受保护”成员并在子类中继承它吗?

c#如何在父类(或是接口)当中定义一个子类必须要重写的字段(属性)?

在子类中定义一个属性,然后在父类中使用它,PHP中的奇怪行为?

子类继承父类怎么在父类的方法中访问子类的变量

总结7

@RequestMapping 不能在父类中使用与子类不同的静态最终常量