C#等价于具有多个Setter方法的Java类
我正在尝试编写Java类的C版本。如果我们调用类C#等价于具有多个Setter方法的Java类,java,c#,setter,getter-setter,Java,C#,Setter,Getter Setter,我正在尝试编写Java类的C版本。如果我们调用类MyRequest,我们将处理一个名为\u body的字段,它是一个JSONObject。这里是我的类的简化版本,只有这个字段 Java: public class MyRequest { JSONObject _body = new JSONObject(); /** * Pass a String formatted json as the request body * @param json
MyRequest
,我们将处理一个名为\u body
的字段,它是一个JSONObject
。这里是我的类的简化版本,只有这个字段
Java:
public class MyRequest {
JSONObject _body = new JSONObject();
/**
* Pass a String formatted json as the request body
* @param json
* @return the request itself
*/
public MyRequest setBody(String json) {
_body = new JSONObject(json);
return this;
}
/**
* Pass a JSONObject formatted json as the request body
* @param json
* @return the request itself
*/
public MyRequest setBody(JSONObject json) {
return setBody(json.toString());
}
/**
* Use an HashMap to build the body
* @param json
* @return the request itself
*/
public MyRequest setBody(HashMap<String, Object> json) {
_body = new JSONObject(json);
return this;
}
/**
* Body getter
* @return the stringified body
*/
public String getBody() {
return _body.toString();
}
@Override
public String toString() {
return new JSONObject()
.put("Resource", _resource)
.put("ID", _id)
.put("Action", _action)
.put("Action ID", _actionId)
.put("Filters", _filters.toString())
.put("Body", _body.toString())
.toString();
}
}
我希望这门课遵循C#编码标准。它们通常具有如下模式:
private int myVar;
public int MyProperty
{
get { return myVar; }
set { myVar = value; }
}
那么,我们如何在C#中为这个Java类提供相同的行为呢?C#中的属性是唯一的。不能有两个具有相同名称和不同数据类型(或具有相同数据类型)的属性
也就是说,除了使用方法以专门的方式设置身体之外,没有其他方法可以实现这一点。Set…
构造在C#中也是一个很好的实践。只需创建一个属性(属于最复杂的数据类型,如JObject
),并为其余属性创建Set…
方法
如果您想在类初始化时设置它,那么一组重载构造函数也是一个选项。(如果需要,可以创建几个重载构造函数,而不是十几个)
当然,您可以创建虚拟属性来设置值,但在我看来,这是一种非常糟糕的做法。C#中的属性是唯一的。不能有两个具有相同名称和不同数据类型(或具有相同数据类型)的属性
也就是说,除了使用方法以专门的方式设置身体之外,没有其他方法可以实现这一点。Set…
构造在C#中也是一个很好的实践。只需创建一个属性(属于最复杂的数据类型,如JObject
),并为其余属性创建Set…
方法
如果您想在类初始化时设置它,那么一组重载构造函数也是一个选项。(如果需要,可以创建几个重载构造函数,而不是十几个)
当然,您可以创建虚拟属性来设置值,但在我看来,这是一种非常糟糕的做法。我通常会有一个与您希望使用getter公开的属性类型相同的属性,然后有其他的
SetBody
方法。因此,有可能:
私有作业主体;
公共字符串体
{
获取{return body.ToString();}
set{body=JObject.Parse(value);}
}
公共主体(作业主体)
{
这个身体=身体;
}
公共实体(IDictionary body)
{
...
}
然而:
- 您可能需要在
方法中克隆SetBody(JObject)
,否则它的行为会非常奇怪JObject
- 将
属性与基础string
变量一起使用可能会很昂贵。。。评估一处房产通常被认为是便宜的JObject
SetBody
方法。因此,有可能:
私有作业主体;
公共字符串体
{
获取{return body.ToString();}
set{body=JObject.Parse(value);}
}
公共主体(作业主体)
{
这个身体=身体;
}
公共实体(IDictionary body)
{
...
}
然而:
- 您可能需要在
方法中克隆SetBody(JObject)
,否则它的行为会非常奇怪JObject
- 将
属性与基础string
变量一起使用可能会很昂贵。。。评估一处房产通常被认为是便宜的JObject
set
-方法中也会有一个与给定数据类型相同的值。因此,在最后的示例中,value
始终是一个int
。MyRequest
类的实际用途是什么?在我看来,这些方法实际上比类的setter方法更多。C#属性的set
-方法中也会有一个与给定数据类型相同的值。因此,在最后的示例中,值
将始终是一个int
。这是有意义的。但是我不太明白克隆的部分。我们不是应该设置当前实例的属性吗?你能在你的答案中加上那一位吗?@Disasterkid:克隆参数-将你的对象与SetBody
方法引用的对象的未来更改隔离开来。否则,您将泄漏实现细节,即真正的底层变量是JObject
。(例如,对传递到SetBody(IDictionary)
中的词典所做的更改可能不会产生任何影响。)这是有意义的。但是我不太明白克隆的部分。我们不是应该设置当前实例的属性吗?你能在你的答案中加上那一位吗?@Disasterkid:克隆参数-将你的对象与SetBody
方法引用的对象的未来更改隔离开来。否则,您将泄漏实现细节,即真正的底层变量是JObject
。(例如,对传递到SetBody(IDictionary)
中的词典所做的更改可能不会产生任何效果。)
private int myVar;
public int MyProperty
{
get { return myVar; }
set { myVar = value; }
}
private JObject body;
public string Body
{
get { return body.ToString(); }
set { body = JObject.Parse(value); }
}
public void SetBody(JObject body)
{
this.body = body;
}
public void SetBody(IDictionary<string, object> body)
{
...
}