是否可以在父类中引用子类?
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#如何在父类(或是接口)当中定义一个子类必须要重写的字段(属性)?