gpt4 book ai didi

c# - 如果对象的引用变量是父类(super class)类型,是否可以访问子类的属性?

转载 作者:太空宇宙 更新时间:2023-11-03 17:48:00 25 4
gpt4 key购买 nike

我是编程和 c# 的新手,如果我的引用变量是父类(super class)类型,我只想知道是否有办法通过属性初始化子类字段。

示例

Character test = new Archer();
test.Damage = 5; // Damage is from the Fighter Class

超类 人物
abstract class Character
{
//Superclass common
}

类(class) 战斗机 的子类人物
abstract class Fighter : Character
{
private int damage
public int Damage {
get
{
return damage;
}
set
{
damage = value;
}
}
}

类(class) 弓箭手 的子类战斗机
class Archer : Fighter
{
//stuffs that only archers can do
}

最佳答案

I am new to programming and to c#



欢迎登机。让我首先鼓励你买一本好书、参加一门类(class)、找一位导师,或者你为了学习一门学科而做的任何事情。 StackOverflow 明确不是一个教程网站 .

is there is a way for me to initialize the subclass fields through property if my reference variable is a superclass type?



初学者程序员的回答是:不。

如果你想访问一个更派生类型的属性,那么你手头的引用必须知道是那个更派生的类型。

C# 是我们所说的“静态类型”语言,这意味着必须有“静态”——即编译器知道的——类型信息来证明每个表达式都是有效的。

高级程序员的回答是:可以,但不要这样做。

C# 有一个“动态”模式;如果你说
dynamic test = new Archer();
test.Damage = 123;

那会奏效。 不要这样做 .两个原因。首先,如果关闭静态类型检查,则静态类型检查将被关闭。你可以写
dynamic test = new Archer();
test.Damaeg = 123;

并且编译器会允许它,并且您的程序会在运行时崩溃。 静态类型检查可以帮助您。用它。

其次,我们添加了 dynamic这样人们就可以编写与 Python 和 JavaScript 等动态语言交互的 C# 程序。在需要时使用它,而不是作为静态类型检查的终点。

Should I use the most specific class instead?



您应该使用足够具体的类。在这种情况下, FighterArcher会做。

在我们查看您的代码时,还有其他一些评论:
private int damage
public int Damage {
get
{
return damage;
}
set
{
damage = value;
}

这是正确的,但这就是您在 C# 1.0 中编写它的方式。在从 3.0 开始的任何 C# 版本中,您通常会编写更短的形式:
public int Damage { get; set; }

并让编译器为您管理支持字段。

还要考虑:*你想要 Damage属性可以在类层次结构之外设置吗?如果答案是“否”,则将其设为 protected set;属性(property)。您是否希望它可以在 Fighter 之外设置?类(class)?如果没有,请设为 private set;您是否希望它在最初设置后完全可以设置?如果否,则(在 C# 7 中)省略 set完全,它只能在构造函数中设置。

此外,这对你来说可能太先进了,但它也可能阻止你走上一条坏路。我写了一系列文章,专门针对您正在探索的问题空间,以及即使是高级程序员也会陷入的常见陷阱。从这里开始: https://ericlippert.com/2015/04/27/wizards-and-warriors-part-one/ -- 我更多地谈论滥用 dynamic在那个系列中也是如此。

关于c# - 如果对象的引用变量是父类(super class)类型,是否可以访问子类的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55304922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com