Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#等价于具有多个Setter方法的Java类_Java_C#_Setter_Getter Setter - Fatal编程技术网

C#等价于具有多个Setter方法的Java类

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

我正在尝试编写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
     * @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
    变量一起使用可能会很昂贵。。。评估一处房产通常被认为是便宜的

我通常会有一个与您希望使用getter公开的属性类型相同的属性,然后有其他的
SetBody
方法。因此,有可能:

私有作业主体;
公共字符串体
{
获取{return body.ToString();}
set{body=JObject.Parse(value);}
}
公共主体(作业主体)
{
这个身体=身体;
}
公共实体(IDictionary body)
{
...
}
然而:

  • 您可能需要在
    SetBody(JObject)
    方法中克隆
    JObject
    ,否则它的行为会非常奇怪
  • string
    属性与基础
    JObject
    变量一起使用可能会很昂贵。。。评估一处房产通常被认为是便宜的

MyRequest的实际用途是什么?在我看来,这些方法实际上比类的setter方法更多。C#属性的
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)
{
    ...
}