覆盖摘要 class 的 属性
Override the property of an abstract class
我想输出我的 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;
}
}
}
}
}
编辑:我认为在 Setter
中使用 numberOfLegs = 4
不好
NumberOfLegs 属性 setter 未被调用,因为您没有在代码中的任何地方更改值。 int 值默认为零。您可以执行以下操作之一:
- 定义
numberOfLegs
变量声明时的默认值:
私人 int numberOfLegs = 4;
- 在 Tiger 的构造函数中定义
numberOfLegs
值 class:
public class Tiger : Animal
{
private int numberOfLegs;
public Tiger() {
numberOfLegs = 4;
}
// ...
}
你做错了...
不要为 numberOfLegs
提供 setter。只需提供一个 getter。然后在构造函数中设置腿数,或者直接设置字段,像这样:
public abstract class Animal
{
public abstract int NumberOfLegs { get; }
}
public class Tiger : Animal
{
private int numberOfLegs = 4;
public override int NumberOfLegs
{
get
{
return numberOfLegs;
}
}
}
您的代码无法正常工作的原因是您没有为 Tiger.NumberOfLegs
调用 setter,但当然,如果您这样做了,您就会意识到这是多么错误:
Tiger tiger1 = new Tiger();
tiger1.NumberOfLegs = 100;
int result = tiger1.NumberOfLegs; // Set to 100, but now it's 4! Urk.
如我所见,从未调用 NumberOfLegs
的 set
访问器,因此 numberOfLegs
的默认值为 0。
您可以编写一个构造函数并为 NumberOfLegs
分配一些值,因为您在 set
访问器中对 4 进行了硬编码,因此无论如何都会分配 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;
}
我想输出我的 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;
}
}
}
}
}
编辑:我认为在 Setter
中使用numberOfLegs = 4
不好
NumberOfLegs 属性 setter 未被调用,因为您没有在代码中的任何地方更改值。 int 值默认为零。您可以执行以下操作之一:
- 定义
numberOfLegs
变量声明时的默认值:
私人 int numberOfLegs = 4;
- 在 Tiger 的构造函数中定义
numberOfLegs
值 class:
public class Tiger : Animal { private int numberOfLegs; public Tiger() { numberOfLegs = 4; } // ... }
你做错了...
不要为 numberOfLegs
提供 setter。只需提供一个 getter。然后在构造函数中设置腿数,或者直接设置字段,像这样:
public abstract class Animal
{
public abstract int NumberOfLegs { get; }
}
public class Tiger : Animal
{
private int numberOfLegs = 4;
public override int NumberOfLegs
{
get
{
return numberOfLegs;
}
}
}
您的代码无法正常工作的原因是您没有为 Tiger.NumberOfLegs
调用 setter,但当然,如果您这样做了,您就会意识到这是多么错误:
Tiger tiger1 = new Tiger();
tiger1.NumberOfLegs = 100;
int result = tiger1.NumberOfLegs; // Set to 100, but now it's 4! Urk.
如我所见,从未调用 NumberOfLegs
的 set
访问器,因此 numberOfLegs
的默认值为 0。
您可以编写一个构造函数并为 NumberOfLegs
分配一些值,因为您在 set
访问器中对 4 进行了硬编码,因此无论如何都会分配 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;
}