这组代码有什么问题?我有错误,我不知道它有什么问题。以下是我想要做的事情的逻辑。有人可以帮我解决这个问题吗?
CustNum
说它隐藏了一个继承的成员,它说Convert.ToInt32
行的错误和new Customer()
方法不起作用。
using System;
public class DebugEight01
{
public static void main()
{
Customer aRegularCustomer = new Customer();
FrequentCustomer aFrequentCustomer = new Customer(); // I have an error here.
aRegularCustomer.CustNum = 2514;
aRegularCustomer.CustBalance = 765.00;
aFrequentCustomer.CustNum = 5719;
aFrequentCustomer.CustBalance = 2500.00;
aFrequentCustomer.DiscountRate = 0.15; //15 %
Console.WriteLine("\naRegularCustomer #{0} owes {1}",
aRegularCustomer.CustNum,
aRegularCustomer.CustBalance = Convert.ToInt32; // I have an error here
Console.WriteLine("\naFrequentCustomer #{0} would owe {1} without the discount",
aFrequentCustomer.CustNum,
aFrequentCustomer.CustBalance.ToString("C2"));
double newBal = (1 - aFrequentCustomer.DiscountRate) *
aFrequentCustomer.CustBalance;
Console.WriteLine("...with {0} discount, customer owes {1}",
aFrequentCustomer.DiscountRate.ToString("P"), newBal.ToString("C"));
}
}
public class Customer
{
private int custNum;
private double custBalance;
public int CustNum
{
get
{
return custNum;
}
set
{
custNum = value;
}
}
public double CustBalance
{
get
{
return custBalance;
}
set
{
CustBalance = value;
}
}
}
class FrequentCustomer : Customer
{
private double discountRate;
public double DiscountRate
{
get
{
return discountRate;
}
set
{
discountRate = value;
}
}
public int CustNum // I have an error here, it's hiding inherited member?
{
get
{
return base.CustNum;
}
set
{
CustNum = value;
}
}
}
答案 0 :(得分:4)
当您使用类和继承时,在实例化变量时会应用一些规则。
如果您的继承树是这样的
class Object +类客户 + class FrequentCustomer
如果在声明的右侧声明类型为Object
的变量,则它可以采用继承树下面的任何类型。这意味着,您的变量属于FrequentCustomer
类型,只需为FrequentCustomer
分配一个实例。如果类型为Customer
,那么它可以同时使用Customer
和FrequentCustomer
,依此类推。所有类都继承类型object
,这就是我将它添加到继承树的原因。
以下是所有有效的声明。
object c = new Customer();
object c = new FrequesntCustomer();
Customer c = new Customer();
Customer c = new FequentCustomer();
FrequentCustomer c = new FrequentCustomer();
这就是您发生第一次编译错误的原因。
第二个错误是因为您错误地使用了Convert.ToInt32()
方法。正确的语法是
Console.WriteLine("\naRegularCustomer #{0} owes {1}",
aRegularCustomer.CustNum,
Convert.ToInt32(aRegularCustomer.CustBalance)); // im having a error here
您的第三个错误不是错误,只是警告。类FrequentCustomer
已经继承了Customer
继承的属性,即使您没有明确指定它们。这意味着,您不需要在CustNum
类中指定属性FrequentCustomer
,它已经继承了它。但是,如果由于某种原因你需要添加属性(因为它的实现与他的父类不同),那么你需要在属性上添加关键字new
,如下所示:
public new int CustNum
{
get
{
return base.CustNum;
}
set
{
CustNum = value;
}
}
如果你不这样做,这将自动完成(隐藏继承的成员),但你会得到一个警告。
答案 1 :(得分:1)
CustNum
需要标记为virtual
。
您的第二个错误是缺少结束括号,以及您实际上并未向Convert.ToInt32
提供参数(即要转换的内容)。
答案 2 :(得分:1)
首先它不是错误(我这里有错误,它隐藏了继承的成员?)。它的警告。无需在子类中重新定义CustNum
属性。这样你就隐藏了基类成员。
错误在 - FrequentCustomer aFrequentCustomer = new Customer();
,必须是,
FrequentCustomer aFrequentCustomer = new FrequentCustomer ();
客户类
中的 -CustBalance
属性出错
public double CustBalance
{
get
{
return custBalance;
}
set
{
// CustBalance = value; <-- It will assign value to property not a field
// will cause StackOverflow
custBalance=value;
}
}
当您将它们打印/写为字符串时,无需转换。
Console.WriteLine("\naRegularCustomer #{0} owes {1}",
aRegularCustomer.CustNum,
aRegularCustomer.CustBalance);
为了更好的练习,请始终使用_(下划线)作为字段的第一个字符或使用Auto-Implemented properties.
public class Customer
{
private int _custNum;
private double _custBalance;
public int CustNum
{
get
{
return _custNum;
}
set
{
_custNum = value;
}
}
.....
}
自动实施的属性:
public class Customer
{
public int CustNum {get;set;}
public double CustBalance {get;set;}
}
答案 3 :(得分:1)
关于隐藏继承成员,
Customer是基类,它已经拥有CustNum属性
所以除非你想覆盖这个
FrequentCustomer aFrequentCustomer = new Customer(); // im having a error here.
Customer aFrequentCustomer = new FrequentCustomer();
第一个声明不起作用,它实际上是相反的。 第二个声明将起作用。 如果你真的想这样做,你可以考虑使用像ICustomer这样的界面
答案 4 :(得分:0)
'inherited member'消息的含义是不再可以从FrequentCutomer类访问Customer类的CustNum属性。它不承认它们应该是同一个属性。您需要通过将客户标记为virtual
并将其标记为public virtual int CustNum
来告诉它。您在FrequentCustomer中将override
标记为public override int CustNum
。在这种情况下,可以从FrequentCustomer类中删除该属性,因为它只是多余的。
我认为你的意思是Convert.ToInt32(aRegularCustomer.CustBalance)
。虽然个人,我从不使用转换。我通常会使用(int)aRegularCustomer.CustBalance
,但这只是我的偏好。
而不是new Customer()
,而不是new FrequentCustomer()
。您无法将Customer
放入FrequentCustomer
变量,因为它不是一个。
还有一件事,你在custBalance = value;
财产中的意思是CustBalance
。否则,设置属性会生成无限循环。
答案 5 :(得分:0)
您的错误是由于linbe:
FrequentCustomer aFrequentCustomer = new Customer(); // im having a error here.
它导致错误,因为您试图在对象中存储对象的引用,该变量被声明为从对象的具体类型(右侧)中提取的类型。这就像创建一个Mammal类型的对象,并试图将其称为猪。可以创建一个猪并将其称为哺乳动物,但创建一个哺乳动物并称之为猪是不行的。