【问题标题】:How to inherit parent constants and access them?如何继承父常量并访问它们?
【发布时间】:2020-02-18 17:43:18
【问题描述】:

如何从父类访问const变量?

我有一个 PI 常量,我想在 TCylinder 类中使用它,如何访问它?我知道我可以使用 Math.PI,但对于未来我想知道

class TCircle {
const double PI = 3.14;
private double radius;

public double Radius { get => radius; set => radius = value; }


public TCircle(double radius)
{
    this.radius = radius;

}
public virtual double GetArea()
{
    return PI * this.radius * this.radius;
}


class TCylinder : TCircle {

private double height;

public TCylinder(double radius, double height)
    : base(radius)
{
    this.height = height;
}

public override double GetArea()
{
    return (2 * base.GetArea()) + (2 * PI * height);//want to access PI
}

}

【问题讨论】:

  • 看看protected关键字。
  • 将其公开或受保护。或者更好的是,创建一个专门的类来公开你的常量。
  • 顺便说一句,我强烈建议您开始遵循 .NET 命名约定,它对类使用 T 前缀。
  • @vc74: 或者使用已经存在的Math.PI :)
  • @JonSkeet True,除非 OP 真的希望 Pi 的值为 3.14

标签: c# oop static constants


【解决方案1】:

正如 Moo-Juice 所说,如果你给常量一个访问修饰符而不是private,那就没问题了。

不过,我会推荐一些稍微不同的东西:完全摆脱常量。它已经存在于System.Math 中(以更精确的形式)。加:

using static System.Math;

在每个源文件的顶部。

作为其他建议:

  • 我会关注.NET naming conventions,放弃T 前缀
  • 我会使用自动实现的属性,而不是带有单独字段的手动实现的属性:

    public double Radius { get; set; }
    

    然后在任何地方都使用该属性。

  • 考虑改为不可变类型。在不知道您如何使用它们的情况下,我们无法判断这是否可行,但至少值得考虑。
  • 考虑更改您的继承模型 - 目前您说可以将圆柱体视为圆形,我预计很少有东西可以真正与 3D 一起使用当他们期待 2D 形状时为实心。

【讨论】:

  • 有了这些建议,他的代码已经变得更短/更简洁了。没有关于表达式主体的方法吗? ;)
【解决方案2】:

您没有为该属性指定访问修饰符,因此它将默认为private。改用protected,继承它的类可以看到它。

【讨论】:

    猜你喜欢
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    相关资源
    最近更新 更多