我是Java新手,但对ActionScript 3有一些OOP经验,所以我试图依靠我所知道的东西进行迁移.
在ActionScript 3中,您可以使用get和set关键字创建getter和setter,这意味着您在类中创建方法并通过该类的实例的属性访问数据.我可能听起来很复杂,但事实并非如此.这是一个例子:
class Dummy{
private var _name:String;
public function Dummy(name:String=null){
this._name = name;
}
//getter
public function get name():String{
return _name;
}
//setter
public function set name(value:String):void{
//do some validation if necessary
_name = value;
}
}
Run Code Online (Sandbox Code Playgroud)
我会name在一个对象中访问:
var dummy:Dummy = new Dummy("fred");
trace(dummy.name);//prints: fred
dummy.name = "lolo";//setter
trace(dummy.name);//getter
Run Code Online (Sandbox Code Playgroud)
我怎么用Java做到这一点?
只是拥有一些公共领域是不可能的.我注意到有一种在方法前面使用get和set的约定,我很好.
例如,
class Dummy{
String _name;
public void Dummy(){}
public void Dummy(String name){
_name = name;
}
public String getName(){
return _name;
}
public void setName(String …Run Code Online (Sandbox Code Playgroud) 我看到代码如下:
class Person
def initialize(name)
@name = name
end
end
Run Code Online (Sandbox Code Playgroud)
我明白这一点让我做这样的事情person = Person.new,并用@name在我的课像其他方法中的别处.然后,我看到代码如下:
class Person
attr_accessor :name
end
...
person = Person.new
person.name = "David"
Run Code Online (Sandbox Code Playgroud)
我只是对这两种方法网格感到茫然.有什么特别的用途def initialize(name)?我想attr_accessor允许我读写.这意味着它们是两种不同的方法.是?希望在澄清def initialize和attr_accessor他们如何网状.
我有以下课程:
class SampleClass
{
private ArrayList mMyList;
SampleClass()
{
// Initialize mMyList
}
public ArrayList MyList
{
get { return mMyList;}
}
}
Run Code Online (Sandbox Code Playgroud)
我希望用户能够获得mMyList,这就是我通过属性公开"获取"的原因,但是我不希望他们对对象做出更改(即.MyList.Add(new Class());)以使其成为回到我班上的路.
我想我可以返回对象的副本,但这可能很慢,我正在寻找一种方法,它将提供编译时错误,通知用户他们不应该期望能够修改返回的值属性.
这可能吗?
简单的问题,希望是一个简单的答案:
我想做以下事情:
private DateTime m_internalDateTime;
public var DateTimeProperty
{
get { return m_internalDateTime.ToString(); } // Return a string
set { m_internalDateTime = value; } // here value is of type DateTime
}
Run Code Online (Sandbox Code Playgroud)
以上只是我想要做的一个例子.我想要一个x类型的内部变量的公共访问器.我希望将该变量作为字符串获取,但使用x类型设置它.
这可能吗?
- 编辑 -
我才意识到我可以做一些像:
private DateTime m_internalDateTime;
public object DateTimeProperty
{
get { return m_internalDateTime.ToString(); } // Return a string
set { m_internalDateTime = (DateTime)value; } // here value is of type DateTime
}
Run Code Online (Sandbox Code Playgroud)
但是,假设我使用类型y而不是"字符串"作为我的"获取"类型.如果我想在我的代码中使用"DateTimeProperty",我必须抛出它.
我对Objective-C很有经验,在Objective-C中你可以让编译器为你生成getter和setter(如果它们还没有存在@synthesize).
有没有办法在C++中执行此操作,还是我需要自己实现所有getter和setter?
只是想知道是否有人能够在Ruby on Rails中对getter setter的基础知识进行一些了解,并提供强类型视图.我对rails上的ruby非常新,并且主要对.NET非常了解.
例如,我们假设我们有一个名为Person的.net类
class Person
{
public string Firstname{get;set;}
public string Lastname{get;set;}
public Address HomeAddress{get;set;}
}
class Address
{
public string AddressLine1{get;set;}
public string City{get;set;}
public string Country{get;set;}
}
Run Code Online (Sandbox Code Playgroud)
在Ruby中,我会写这个
class Person
attr_accessor :FirstName
attr_accessor :LastName
attr_accessor :HomeAddress
end
class Address
attr_accessor :AddressLine1
attr_accessor :City
attr_accessor :Country
end
Run Code Online (Sandbox Code Playgroud)
查看Person类的Ruby版本如何指定访问器方法FirstName,LastName和HomeAddress的类型?如果我要使用这个类,我可以将任何类型提供给HomeAddress,但我希望这个访问器方法只接受TYPE地址.
有什么建议 ?
谢谢
假设我有一个Foo有std::string成员的班级str.应该get_str返回什么?
std::string Foo::get_str() const
{
return str;
}
Run Code Online (Sandbox Code Playgroud)
要么
const std::string& Foo::get_str() const
{
return str;
}
Run Code Online (Sandbox Code Playgroud)
什么是C++更惯用?
为什么我们能写
public int RetInt
{
get;set;
}
Run Code Online (Sandbox Code Playgroud)
代替
public int RetInt
{
get{return someInt;}set{someInt=value;}
}
Run Code Online (Sandbox Code Playgroud)
两者有什么区别?
概观
在我的(Android)Java游戏中,我有一个名为resources的类.顾名思义,这个班级掌握了游戏的资源.我在这里创建了所有的OpenGL对象(Sprite)
它看起来像下面的内容(显然,这是一个简化的版本,与真实项目中出现的版本相比):
public class Resources {
Hero hero;
Enemy enemy;
MenuButtons mainMenuButtons;
Background background;
Scene mainMenu;
public void createObjects(){
hero = new Hero();
enemy = new Enemy();
mainMenuButtons = new MenuButtons();
background = new Background();
mainMenu = new Scene(this);
}
}
Run Code Online (Sandbox Code Playgroud)
所以,在我的mainMenu场景中,我需要访问我的对象,所以我们可能会看到这样的东西:
public class mainMenu implements Scene {
Resources resources;
public mainMenu(Resources resources){
this.resources = resources;
}
@Override
public void render(){
resources.background.draw();
resources.hero.draw();
resources.enemy.draw();
mainMenuButtons.draw();
}
@Override
public void updateLogic(){
resources.hero.move();
resources.enemy.move();
resources.mainMenubuttons.animate();
}
} …Run Code Online (Sandbox Code Playgroud)