继承的逻辑错误和语法错误

时间:2012-01-04 01:45:44

标签: c# inheritance

这组代码有什么问题?我有错误,我不知道它有什么问题。以下是我想要做的事情的逻辑。有人可以帮我解决这个问题吗?

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;
        }
    }
}

6 个答案:

答案 0 :(得分:4)

当您使用类和继承时,在实例化变量时会应用一些规则。

如果您的继承树是这样的

class Object  +类客户      + class FrequentCustomer

如果在声明的右侧声明类型为Object的变量,则它可以采用继承树下面的任何类型。这意味着,您的变量属于FrequentCustomer类型,只需为FrequentCustomer分配一个实例。如果类型为Customer,那么它可以同时使用CustomerFrequentCustomer,依此类推。所有类都继承类型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上指定它
   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类型的对象,并试图将其称为猪。可以创建一个猪并将其称为哺乳动物,但创建一个哺乳动物并称之为猪是不行的。