【问题标题】:Calling a child class' method调用子类的方法
【发布时间】:2013-07-07 00:16:03
【问题描述】:

我正在尝试使用此方法使用包含一系列字符串的列表

    public  List<String> ListJobs(Job job)
    {
        List<String> ListJobs = new List<string>();

        foreach (Job curjob in Jobs)
        {


            String jobAsString = curjob.ToString();

            ListJobs.Add(jobAsString); 

        }
        return ListJobs;
  //Get the list of strings  

我目前的结构是

JobLedger(全部包含在其中的列表)

然后是由Visit和Pickup继承的Job Parent类问题是,在上面的代码中,并没有在子类中使用覆盖的tostring方法,而是默认为父类。

    public void NewerList()
        //No Pickup display problem is here. Liststring refers to base sting method instead of child
    {


        LstJob.Items.Clear();
        //Clears the list


        List<String> listOfVis = TheLedger.ListJobs(Thejob);
        //Get a list of strings to display in the list box


        LstJob.Items.AddRange(listOfVis.ToArray());


    }

我似乎已将其范围缩小到这段代码,列表调用父作业类,而不是任何一个子类

【问题讨论】:

  • 什么是Jobs?我只能看到ListJobs的定义。
  • Jobs 声明在哪里?为什么不使用job?顺便说一句:Jobs.Select(job =&gt; job.ToString()).ToList() 类似,但看起来更短。
  • 您确实需要整理变量的命名等。 ListJobs 是一种类型,但在下面一行您使用 ListJobs 作为变量的名称。变量实际上应该以小写字母开头,除非它是常量,在这种情况下,所有大写单词都由_分隔
  • @JonTaylor:在 C# 中,常量通常不按照大写+下划线方案命名。这是 C 和 C++ 程序中使用的样式。在 C# 中,常量遵循与类和方法相同的命名规则:Pascal Case,即大驼峰式
  • @DanielHilgarth 我的立场是正确的,但是这甚至是合法的代码吗?如何确定在 ListJobs 类上调用静态方法或在 ListJobs 变量上调用实例方法之间的区别?我自己从来没有使用过 C#,但是将变量命名为与类完全相同仍然很糟糕?

标签: c# inheritance methods polymorphism


【解决方案1】:

确保你真的覆盖 ToString

您所描述的内容听起来更像是在派生类中遮蔽它。

override(你想要的):

public override string ToString()
{
    // ...
}

影子(我认为你有):

public string ToString()
{
    // ...
}

// or:

public new string ToString()
{
    // ...
}

【讨论】:

  • 我在每种情况下都覆盖了 tostring 方法。主要问题是 listjobs 方法正在调用父作业类中的 Tostring,而不是预期的子类
  • @DenisAllan:但这正是多态性应该为您解决的问题。请显示一些代码,让我们重现您的问题。
  • 'public void NewerList() //这里没有Pickup显示问题。 Liststring 指的是基本 sting 方法而不是 child { LstJob.Items.Clear(); //清除列表 List listOfVis = TheLedger.ListJobs(Thejob); //获取要在列表框中显示的字符串列表 LstJob.Items.AddRange(listOfVis.ToArray()); }' 这是我已经完成的代码,'List' 方法调用父'job' 类中的基本'tostring()'。对不起,如果我在这里的格式不好。
  • @DenisAllan:请使用此信息更新您的问题。
【解决方案2】:

您需要在被覆盖的方法之前使用override

【讨论】:

  • 好。只是让您知道:我没有投反对票,所以我无法删除您已经获得的 -1。
  • @DanielHilgarth:没问题。如果这不是正确答案,我会在几分钟后将其删除:)
【解决方案3】:

尝试将要获取的对象类型转换为包含您要使用的函数的类。

【讨论】:

  • @DGibbs 如您所见,我不需要声望就可以对我尚未发表的帖子发表评论。我是新来的
  • 欢迎来到 SO!考虑通读this。如果你不能提供正确的答案,那么你根本不应该回答。
  • 我试图用“试试这个”的方式给出答案。我认为按照我的回答进行操作会有所帮助。但我同意我不确定我的答案是否正确。
  • 我不同意 DGibbs,如果你有什么要贡献的,那么你应该贡献,当你有发表评论的声誉时,这就是应该的
猜你喜欢
  • 2016-02-14
  • 2011-09-04
  • 2019-01-05
  • 2017-11-09
  • 2011-10-24
  • 2018-01-22
  • 1970-01-01
  • 2015-06-20
  • 1970-01-01
相关资源
最近更新 更多