列表未正确加载

时间:2014-12-17 13:53:35

标签: c# oop inheritance abstract-class

我有一个Tax抽象类

 public abstract class Tax
    {
        public  string TaxType;
        public  int TaxAmnt;
    }

它有属性(TaxTypeTaxAmnt)和一个抽象方法(我现在已将其删除以解决此问题)

我有2个派生类 - BasicSalesTaxImportTax继承税

public class BasicSalesTax : Tax
    {
        public string TaxType;
        public int TaxAmnt;
        public BasicSalesTax():base()
        {
            this.TaxType = "BasicSalesTax";
            this.TaxAmnt = 10;
        }
    }

在我的main.cs中,我想创建一个包含所有税费的列表Taxlist

List<Tax> objTaxlist = new List<Tax>();
BasicSalesTax objtax1 = new BasicSalesTax();

objtaxlist.Add(objtax1);

objtaxlist添加了1个项目,但其属性为null&amp;分别为0。 我该怎么办?

调试时,objtax1被正确加载。我可以正确地看到它属性。 但是,当我查看objtaxlist的内容时,我看到attirbutes为null&amp; 0

2 个答案:

答案 0 :(得分:1)

问题似乎是您隐藏了基类字段。

如果您的基类和派生类具有相同的名称,而没有override / virtual修饰符,则这些实际上是两个不同的字段:

class Base
{
     public int Amount = 0;
}

class Derived : Base
{
     public int Amount = 10;
}

void Main()
{  
    Derived d = new Derived();
    Console.WriteLine(d.Amount); // should print 10.
    Base b = d;
    Console.WriteLine(b.Amount); // should print 0.
}

这是因为当您以Derived方式访问该对象时,您正在访问Derived.Amount字段,但是当您通过Base访问时,您就是&#39 ;重新访问单独的Base.Amount字段。您的编译器应该发出警告,表明您正在隐藏继承的字段。

继承时,您不需要重新定义继承的字段。它们自动成为派生类型的一部分:

class Base
{
     public int Amount = 0;
}

class Derived : Base
{
     public Derived() // You don't need to explicitly call base().
     {
         Amount = 10;
     }
}

void Main()
{  
    Derived d = new Derived();
    Console.WriteLine(d.Amount); // should print 10.
    Base b = d;
    Console.WriteLine(b.Amount); // should print 10 as well.
}

答案 1 :(得分:0)

只需摆脱TaxTypeTaxAmnt形成BasicSalesTax定义,这样您就可以使用继承的好处。

或者(与您当前的实现一样)访问隐藏属性,您必须将项目从列表转换为实际类型。

var res = (BasicSalesTax)objTaxlist[0];

通过强制转换,您可以将对象从常规类型(Tax)“解包”到特定类型(BasicSalesTax),然后展示该特定类型的属性。以前,它们被一般类型所隐藏。

但是,不是修补错误实现的类型层次结构的对象访问,而是首先修复类型实现。