【问题标题】:List not getting loaded correctly列表未正确加载
【发布时间】:2014-12-17 13:53:34
【问题描述】:

我有一个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 个 item ,但其属性分别为 null 和 0。 我该如何解决这个问题??

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

【问题讨论】:

  • 您可以将代码发布到抽象Tax 类吗?你的构造函数里有代码吗?
  • 该列表与诊断为什么单个对象 objtax1 的属性没有保留其构造值无关。我会首先通过每个构造函数调用来调试它。
  • 您将属性隐藏在基类中(假设Tax 具有属性TaxTypeTaxAmnt)。使用 override 关键字。
  • 这是什么 "BasicSalesTax() objtax1 = new basicsalestax();"
  • odyss-jii,谢谢它成功了!!!!

标签: c# oop inheritance abstract-class


【解决方案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 访问时,您访问的是单独的 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.
}

【讨论】:

    【解决方案2】:

    只需在 BasicSalesTax 定义中去掉 TaxTypeTaxAmnt,这样您就可以利用继承的好处。

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

    var res = (BasicSalesTax)objTaxlist[0];
    

    通过将对象从一般类型 (Tax) 转换为特定类型 (BasicSalesTax) 并公开该特定类型的属性。以前,它们被通用类型隐藏了。

    不过,与其修补错误实现的类型层次结构的对象访问,不如先修复类型实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 2011-10-24
      • 2021-01-09
      • 1970-01-01
      • 2023-03-11
      • 2021-05-25
      相关资源
      最近更新 更多