c#继承构建错误

本文关键字:错误 构建 继承 | 更新日期: 2023-09-27 18:16:30

我是Stack Overflow的新手,也是一个新手程序员。我试图在Visual Studio 2010中构建c#其他人的代码作为学习机会。我无法弄清楚为什么我在四个类中得到以下三个错误(第50、59、67、&75)在附带的存根代码的底部(我从原始程序中剥离了与错误无关的所有内容):

<>之前1. " c_basic_object ">方法必须有返回类型2. :";预期3." (p_name) "类、结构或接口成员声明中的无效令牌')'4. " p_name ">类型或命名空间名称'p_name'无法找到(您是否缺少using指令或程序集引用?)之前

代码几乎与Andrew Troelsen的Pro c# 2005第4章中的Employee和Manager类相同。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestStub
{
class Program
{
    static void Main(string[] args)
    {
        String strTest1 = "This is a string #1";
        String strTest2 = "This is a string #2";
        c_basic_object objBasic = new c_basic_object(strTest1);
        Console.WriteLine(objBasic.m_name);
        c_abstract_button_widget objButton = new c_abstract_button_widget();
        Console.WriteLine("Test, Test, Test");
        Console.ReadKey(true);
        Console.WriteLine();
    }
}// End class Program
public class c_basic_object
{
    public string m_name = String.Empty;
    //Constructor  create_basic_object( p_name)
    public c_basic_object(string p_name)
    {
        m_name = p_name;
    }
    // create_basic_object
    //Constructor  construct_empty()
    public c_basic_object()
    {
    }
    // construct_empty
    //@ Destructor  Destroy()
    ~c_basic_object()
    {
    }
} // End class c_basic_object

// -- definitions only for the Virtual Abstract functions in the factory
public class c_abstract_button_widget: c_basic_object
{
    public c_basic_object(string p_name) : base(p_name)
    {
        //Console.WriteLine("Inside c_abstract_button_widget ");
    }
} // end c_abstract_button_widget
// c_abstract_button_widget
public class c_abstract_label_widget: c_basic_object
{
    public c_basic_object(string p_name) : base(p_name)
    {
    }
} // end c_abstract_label_widget
// c_abstract_label_widget
public class c_abstract_draw_surface_widget: c_basic_object
{
    public c_basic_object(string p_name) : base(p_name)
    {
    }
} // end c_abstract_draw_surface_widget
// c_abstract_draw_surface_widget
public class c_abstract_scrollbar_widget: c_basic_object
{
    public c_basic_object(string p_name) : base(p_name)
    {
    }
} // end c_abstract_scrollbar_widget
}// End namespace TestStub

c#继承构建错误

问题就在这里:

public class c_abstract_button_widget: c_basic_object
{
    public c_basic_object(string p_name) : base(p_name)
    {
        //Console.WriteLine("Inside c_abstract_button_widget ");
    }
}

要声明构造函数,必须指定类名—但是您已经编写了c_basic_object。你的意思:

public class c_abstract_button_widget: c_basic_object
{
    public c_abstract_button_widget(string p_name) : base(p_name)
    {
        //Console.WriteLine("Inside c_abstract_button_widget ");
    }
}

你的其他子类也有同样的问题。

单独地,你应该绝对地开始遵循。net命名约定。在这种情况下,您的类应该是:

  • BasicObject
  • AbstractButtonWidget
  • AbstractLabelWidget
  • AbstractScrollbarWidget

…尽管考虑到你的"抽象"类实际上并不是抽象的,你可能想要重命名它们…可能你的BasicObject应该是WidgetBase(或AbstractWidget,实际上是抽象的…)

你的参数应该是name而不是p_name

我还建议将所有字段保持私有(我也会放弃m_前缀,但如果字段是私有的,则不是所以不好)-您可能希望将名称作为属性公开。此外,c#中几乎不需要终结器/析构函数。当然,在你真的,真的知道你需要它们之前,不要开始添加它们。

“c_basic_object” Method must have a return type

您试图在派生类中创建构造函数,但是构造函数应该以包含它的类命名,而不是基类。因此,编译器将其作为一个名为c_basic_object的方法处理,该方法必须具有返回类型。

这应该修复其他编译器错误,因为: base(p_name)不是方法的有效语法。

重新命名你的构造函数:

public class c_abstract_button_widget: c_basic_object
{
    public c_abstract_button_widget(string p_name) : base(p_name)
    {
        //Console.WriteLine("Inside c_abstract_button_widget ");
    }
} 
public class c_abstract_label_widget: c_basic_object
{
    public c_abstract_label_widget(string p_name) : base(p_name)
    {
    }
} 
public class c_abstract_draw_surface_widget: c_basic_object
{
    public c_abstract_draw_surface_widget(string p_name) : base(p_name)
    {
    }
} 
public class c_abstract_scrollbar_widget: c_basic_object
{
    public c_abstract_scrollbar_widget(string p_name) : base(p_name)
    {
    }
} 

其他建议:

  1. 去掉空的"析构函数"。在c#中很少需要它(在某些上下文中称为"终结器")
  2. 阅读命名标准。c#是区分大小写的,所以驼峰大小写比下划线分隔要好。