我只是想知道我是否有一个常量属性,我可以设置一个公共属性来封装吗?
e.g。
private const int DEFAULT_CHARGE = 200;
public int default_charge
{
get { return DEFAULT_CHARGE; }
}
我没有得到任何错误,但如果某些事情是不变的,我真的不明白为什么我们封装它的逻辑。我真的很想知道为什么会这样:
答案 0 :(得分:1)
即使某些内容不变,您仍然可以控制如何将其返回给调用者。如果你有一个存储到5位小数的Double变量,你可能希望将值返回给2个小数位的调用者。封装可以帮助您控制字段。
所以你可能需要像这样封装一个常量字段
private const double DEFAULT_CHARGE = 200.12345;
public int default_charge
{
get { return Math.round(DEFAULT_CHARGE,2); }
}
答案 1 :(得分:1)
您可能希望实施interface
,abstract class
等:
public interface IChargable {
int default_charge {get;}
}
public class MySimpleChargable: IChargable {
private const int DEFAULT_CHARGE = 200;
public int default_charge {get { return DEFAULT_CHARGE; }}
}
您可以将此类构造实现为存根:
初始:
// Version 1.0
public class MyChargable {
private const int DEFAULT_CHARGE = 200;
//TODO: implement (rare) "some condition" case
public int default_charge {get { return DEFAULT_CHARGE; }}
}
随后:
// Version 1.1
public class MyChargable {
private const int DEFAULT_CHARGE = 200;
public int default_charge {
get {
if (some condition)
return SomeComputation();
return DEFAULT_CHARGE;
}
}
答案 2 :(得分:1)
了解常量是由编译器内联非常重要。这意味着这两个例子产生了相同的程序:
private const int DEFAULT_CHARGE = 200;
public int default_charge
{
get { return DEFAULT_CHARGE; }
}
编译后与此相同:
public int default_charge
{
get { return 200; }
}
如您所见,编译后对DEFAULT_CHARGE
的引用将丢失。对于在多个项目中重用相同常量的解决方案,这一点很重要。
我们假设您在LibA和LibB中使用DEFAULT_CHARGE
作为public const
。您的项目经理告诉您将值从200更改为300.本能地,您转到LibA,其中DEFAULT_CHARGE
已定义,您将其更改为300,然后您重新编译并仅部署LibA。
结果是LibA现在使用新值300,但LibB继续使用旧值200,因为常量在编译时被烘焙到DLL中。
您可以封装常量的原因是您可以更轻松地更改值。需求往往会随着时间而变化。今天不变的DEFAULT_CHARGE
值可能必须在将来被配置值替换。
通过封装常量,您还可以防止我刚才解释的问题。如果LibA和LibB(以及LibX,LibY,LibZ,...)都依赖于封装,您只需重新编译和部署LibA即可在所有相关程序中设置默认费用。
答案 3 :(得分:0)
这取决于您的要求 通常,属性被设计为封装您想要的任何获取/设置逻辑,甚至是可计算的值或常量 在我看来,返回私有常量值的公共财产在架构方面是好的,在这种情况下,使用你的代码的人根本不知道他是否一直工作,即他是从你的实现中抽象出来的,这很好。如果你决定让它不是一个恒定但可配置的值,那么你就不会将它暴露给你的图书馆消费者,你只需要这样做:
public int DefaultCharge
{
get
{
return CurrentUser.PersonalSettings.DefaultCharge;
}
}
甚至
public int DefaultCharge
这使得此代码依赖于用户'个人设置,不向客户说明任何事情。
这是主要的好处。它完全是关于封装和抽象的。
但是请使用适当的属性命名 - 它应该是use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191);
}
,并注意Jeroen Mostert关于常量内联的评论。
答案 4 :(得分:0)
据我所知,你可以创建一个私有常量的公共访问器,没有问题。
您应该在以下时间创建常量的访问者: