我有一个Tax
抽象类
public abstract class Tax
{
public string TaxType;
public int TaxAmnt;
}
它有属性(TaxType
,TaxAmnt
)和一个抽象方法(我现在已将其删除以解决此问题)
我有2个派生类 - BasicSalesTax
,ImportTax
继承税
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
答案 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)
只需摆脱TaxType
和TaxAmnt
形成BasicSalesTax
定义,这样您就可以使用继承的好处。
或者(与您当前的实现一样)访问隐藏属性,您必须将项目从列表转换为实际类型。
var res = (BasicSalesTax)objTaxlist[0];
通过强制转换,您可以将对象从常规类型(Tax
)“解包”到特定类型(BasicSalesTax
),然后展示该特定类型的属性。以前,它们被一般类型所隐藏。
但是,不是修补错误实现的类型层次结构的对象访问,而是首先修复类型实现。