如果函数使用 "this",从子 class 调用函数是否包含子 class 的属性?
If a function uses "this", does invoking the function from a child class include the properties of the child class?
我创建了一个 class,其中包含一个使用“this”关键字将自身序列化为 JSON 字符串的函数,此 class 然后由子 [=19] 继承=].
public class Parent
{
int a { get; set; }
public ToJsonString()
{
return JsonSerializer.Serialize(this);
}
}
public class Child : Parent
{
int b { get; set; }
}
如果子 class 的实例随后调用 ToJsonString() 函数,返回的字符串将包含来自子 class 的属性,还是仅包含来自父 class 的属性]?
Child instance = new Child();
string serialized = instance.ToJsonString();
这很容易测试(见下面的代码)。
ToJsonString
的原始版本有一个 Parent
参数并且只序列化 Parent
属性。
这可以通过使用相同的实现覆盖 Child
中的 ToJsonString
来补救:
using System.Text.Json;
Console.WriteLine($"Using parent version of 'ToJsonString': {new Child().BaseToJsonString()}");
Console.WriteLine($"Using child version of 'ToJsonString': {new Child().ToJsonString()}");
Console.WriteLine($"Using better version of 'ToJsonString': {new Child().BetterToJsonString()}");
public class Parent
{
public int A { get; set; } = 1;
public string BaseToJsonString()
{
return JsonSerializer.Serialize(this);
}
public virtual string ToJsonString()
{
return JsonSerializer.Serialize(this);
}
public string BetterToJsonString()
{
return JsonSerializer.Serialize(this, GetType());
}
}
public class Child : Parent
{
public int B { get; set; } = 2;
public override string ToJsonString()
{
return JsonSerializer.Serialize(this);
}
}
这产生:
使用 'ToJsonString' 的父版本:{"A":1}
使用 'ToJsonString' 的子版本:{"B":2,"A":1}
使用更好的 'ToJsonString' 版本:{"B":2,"A":1}
编辑:
正如 Petrusion 正确指出的那样,另一个更简单的解决方案是强制 Serialize
方法使用实际的运行时类型(参见上面的 BetterToJsonString
方法)。
我创建了一个 class,其中包含一个使用“this”关键字将自身序列化为 JSON 字符串的函数,此 class 然后由子 [=19] 继承=].
public class Parent
{
int a { get; set; }
public ToJsonString()
{
return JsonSerializer.Serialize(this);
}
}
public class Child : Parent
{
int b { get; set; }
}
如果子 class 的实例随后调用 ToJsonString() 函数,返回的字符串将包含来自子 class 的属性,还是仅包含来自父 class 的属性]?
Child instance = new Child();
string serialized = instance.ToJsonString();
这很容易测试(见下面的代码)。
ToJsonString
的原始版本有一个 Parent
参数并且只序列化 Parent
属性。
这可以通过使用相同的实现覆盖 Child
中的 ToJsonString
来补救:
using System.Text.Json;
Console.WriteLine($"Using parent version of 'ToJsonString': {new Child().BaseToJsonString()}");
Console.WriteLine($"Using child version of 'ToJsonString': {new Child().ToJsonString()}");
Console.WriteLine($"Using better version of 'ToJsonString': {new Child().BetterToJsonString()}");
public class Parent
{
public int A { get; set; } = 1;
public string BaseToJsonString()
{
return JsonSerializer.Serialize(this);
}
public virtual string ToJsonString()
{
return JsonSerializer.Serialize(this);
}
public string BetterToJsonString()
{
return JsonSerializer.Serialize(this, GetType());
}
}
public class Child : Parent
{
public int B { get; set; } = 2;
public override string ToJsonString()
{
return JsonSerializer.Serialize(this);
}
}
这产生:
使用 'ToJsonString' 的父版本:{"A":1}
使用 'ToJsonString' 的子版本:{"B":2,"A":1}
使用更好的 'ToJsonString' 版本:{"B":2,"A":1}
编辑:
正如 Petrusion 正确指出的那样,另一个更简单的解决方案是强制 Serialize
方法使用实际的运行时类型(参见上面的 BetterToJsonString
方法)。