重写抽象类的属性
本文关键字:属性 抽象类 重写 | 更新日期: 2023-09-27 18:19:41
我想输出我的 tiger1 实例的numberOfLegs
。但是输出是 0 而不是我预期的 4。我的错误在哪里?请帮助老虎恢复双腿。
using System;
namespace AbstractProperty
{
class MainClass
{
static void Main(string[] args)
{
Tiger tiger1 = new Tiger();
int result = tiger1.NumberOfLegs;
Console.WriteLine(result);
Console.Read();
}
public abstract class Animal
{
public abstract int NumberOfLegs { get; set; }
}
public class Tiger : Animal
{
private int numberOfLegs;
public override int NumberOfLegs
{
get
{
return numberOfLegs;
}
set
{
numberOfLegs = 4;
}
}
}
}
}
编辑:我认为在二传手中使用numberOfLegs = 4
不好
如我所见,从不调用 NumberOfLegs
的 set
访问器,因此numberOfLegs
的默认值为 0。
您可以编写一个构造函数并为NumberOfLegs
分配一些值,无论如何都会为其分配 4,因为您在 set
访问器中硬编码了 4,即如果您像这样编写构造函数:
public Tiger() {
NumberOfLegs = 10;
}
set
访问器将被调用并将4
(而不是10
(分配给numberOfLegs
。也许你在这里混淆了概念:)
编辑 1:如果您现在明白在 setter 中分配硬编码值并不是那么好,并且您不想在 setter 中做任何特殊的事情,那么最好对属性使用传统方法:
private int numberOfLegs;
public override int NumberOfLegs
{
get
{
return numberOfLegs;
}
set
{
numberOfLegs = value;
}
}
或者干脆
public override int NumberOfLegs { get; set; }
它的作用与上述相同。
并在构造函数中为NumberOfLegs
赋值:
public Tiger()
{
NumberOfLegs = 4;
}
不会调用 NumberOfLegs 属性 setter,因为您不会在代码中的任何位置更改值。默认情况下,int 值为零。您可以执行以下操作之一:
- 在声明变量时定义变量
numberOfLegs
默认值:
私有整数腿数 = 4;
- 在 Tiger 类的构造函数中定义
numberOfLegs
值:
public class Tiger : Animal { private int numberOfLegs; public Tiger() { numberOfLegs = 4; } // ... }
你做错了...
不要为numberOfLegs
提供二传手。只需提供一个吸气剂。然后在构造函数中设置腿数,或者直接设置字段,如下所示:
public abstract class Animal
{
public abstract int NumberOfLegs { get; }
}
public class Tiger : Animal
{
private int numberOfLegs = 4;
public override int NumberOfLegs
{
get
{
return numberOfLegs;
}
}
}
你的代码不起作用的原因是因为你没有调用 setter 进行Tiger.NumberOfLegs
,但当然,如果你这样做了,你会意识到它是多么错误:
Tiger tiger1 = new Tiger();
tiger1.NumberOfLegs = 100;
int result = tiger1.NumberOfLegs; // Set to 100, but now it's 4! Urk.