我目前正在开发一个简单的Java游戏,有几种不同的模式.我扩展了一个主要的Game类,将主要逻辑放在其他类中.尽管如此,主要的游戏类仍然非常沉重.
在快速浏览一下我的代码后,其中大部分是Getters and Setters(60%),而其余部分则是游戏逻辑真正需要的.
一些谷歌搜索声称Getters和Setters是邪恶的,而其他人声称他们是良好的OO练习和伟大的程序所必需的.
所以我该怎么做?应该是哪个?我应该为我的私人变量更改我的Getters和Setter,还是应该坚持使用它们?
我希望能够在一个包中编写一个Java类,它可以访问另一个包中的类的非公共方法,而不必使它成为另一个类的子类.这可能吗?
我正在学习Swift,我正在读The Swift Programming Language
Apple,我没有Objective C背景(只有PHP,JS和其他但没有Obj C)
在页24-25我看到这个代码:
//...Class definition stuff...
var perimeter: Double {
get {
return 3.0 * sideLength
}
set {
sideLength = newValue / 3.0
}
}
//...Class continues...
Run Code Online (Sandbox Code Playgroud)
这部分未在书中指定,我无法得到它们的用途.
谁能解释一下这个获取和设置是什么?
谁能解释通过self.attribute
和通过访问实例属性之间的区别@attribute
?
目前,TypeScript
不允许在接口中使用get/set方法(访问器).例如:
interface I {
get name():string;
}
class C implements I {
get name():string {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
此外,TypeScript不允许在类方法中使用Array Function Expression:例如:
class C {
private _name:string;
get name():string => this._name;
}
Run Code Online (Sandbox Code Playgroud)
有没有其他方法可以在接口定义上使用getter和setter?
关于C++中的访问器方法的几个问题已经被问到,但没有一个能够满足我对这个问题的好奇心.
我试图尽可能避免使用访问器,因为像Stroustrup和其他着名的程序员一样,我认为一个类很多都是OO的标志.在C++中,我可以在大多数情况下为类添加更多的责任或使用friend关键字来避免它们.但在某些情况下,您确实需要访问特定的班级成员.
有几种可能性:
1.根本不要使用存取器
我们可以公开相应的成员变量.这在Java中是不行的,但对于C++社区似乎没问题.但是,我有点担心的情况是一个显式副本或一个对象的只读(const)引用应该返回,是夸大了吗?
2.使用Java样式的get/set方法
我不确定它是否来自Java,但我的意思是:
int getAmount(); // Returns the amount
void setAmount(int amount); // Sets the amount
Run Code Online (Sandbox Code Playgroud)
3.使用客观的C风格的get/set方法
这有点奇怪,但显然越来越普遍:
int amount(); // Returns the amount
void amount(int amount); // Sets the amount
Run Code Online (Sandbox Code Playgroud)
为了使其工作,您必须为您的成员变量找到不同的名称.有些人附加下划线,其他人加上"m_".我也不喜欢.
你使用哪种风格?为什么?
有没有办法在TypeScript中为属性设置私有的setter?
class Test
{
private _prop: string;
public get prop() : string
{
return this._prop;
}
private set prop(val: string)
{
//can put breakpoints here
this._prop = val;
}
}
Run Code Online (Sandbox Code Playgroud)
编译器抱怨getter和setter的可见性不匹配.我知道我可以设置支持字段,但是当设置值时我不能设置断点.
我虽然使用接口来隐藏setter,但是接口只能定义一个属性,而不是它是否在setter上有getter.
我在这里错过了什么吗?似乎没有任何理由不允许私有的setter,结果JS不会强制执行可见性,并且似乎比当前的替代品更好.
我错过了什么吗?如果不是,没有私人制定者的充分理由?
我最近学到了c#,所以当我学会写属性时,我被教会这样做:
public string Name { get; set; }
Run Code Online (Sandbox Code Playgroud)
汽车房产很棒!但是现在我正在尝试做一些更复杂的事情,所以我需要编写一对自定义访问器.
private string _Name;
public string Name {
get { return _Name; }
set { _Name = value }
}
Run Code Online (Sandbox Code Playgroud)
我知道当一个人使用autos时,编译器会将私有实例变量放在它的黑暗深处,但是我被宠坏了并且不希望那个私有变量看起来毫无意义.
有没有办法在没有私有变量的情况下使用自定义访问器?
我只是对此感到好奇:以下代码无法编译,因为我们无法修改foreach迭代变量:
foreach (var item in MyObjectList)
{
item = Value;
}
Run Code Online (Sandbox Code Playgroud)
但是以下将编译并运行:
foreach (var item in MyObjectList)
{
item.Value = Value;
}
Run Code Online (Sandbox Code Playgroud)
为什么第一个无效,而第二个可以在下面做同样的事情(我正在为此寻找正确的英语表达,但我不记得了.在...下面??^^)
我有一个Account
班级的实例.每个帐户对象都有一个所有者,参考等.
我可以访问帐户属性的一种方法是通过访问器
account.Reference;
Run Code Online (Sandbox Code Playgroud)
但我希望能够使用动态字符串选择器访问它,如:
account["PropertyName"];
Run Code Online (Sandbox Code Playgroud)
就像在JavaScript中一样.所以我会有account["Reference"]
哪些会返回值,但我也希望能够在之后分配一个新值,如:
account["Reference"] = "124ds4EE2s";
Run Code Online (Sandbox Code Playgroud)
我注意到我可以使用
DataBinder.Eval(account,"Reference")
Run Code Online (Sandbox Code Playgroud)
获取基于字符串的属性,但使用此属性我无法为属性赋值.
我怎么能这样做?