C#继承构建错误

1 c#

我是Stack Overflow和新手程序员的新手.我正在尝试构建Visual Studio 2010 C#其他人的代码作为学习机会.我无法弄清楚为什么我在附加的存根代码底部的四个类(第50,59,67和75行)中得到以下三个错误(我从原始程序中删除了所有与错误无关的内容) ):

1.  “c_basic_object” ?  Method must have a return type
2.  “:” ? ; expected
3.  “(p_name)” Invalid token ')' in class, struct, or interface member declaration
4.  “p_name” ? The type or namespace name 'p_name' could not be found (are you missing a using directive or an assembly reference?)

该代码几乎与Andrew Troelsen在第4章的Pro C#2005中的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
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 7

问题出在这里:

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 ");
    }
}
Run Code Online (Sandbox Code Playgroud)

要声明构造函数,您必须指定类名 - 但是您已经编写过了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 ");
    }
}
Run Code Online (Sandbox Code Playgroud)

您的其他子类也有同样的问题.

另外,您绝对应该开始遵循.NET命名约定.在这种情况下,您的类应该是:

  • BasicObject
  • AbstractButtonWidget
  • AbstractLabelWidget
  • AbstractScrollbarWidget

...虽然假设你的"抽象"类实际上并不是抽象的,但你可能想要更多地重命名它们......也许你BasicObject应该是WidgetBase(或者AbstractWidget,实际上是抽象的......)

你的参数应该只是name代替p_name.

我还建议保持所有字段都是私有的(我也会抛弃m_前缀,但如果该字段是私有的并不是那么糟糕) - 您可能希望将该名称公开为属性.

此外,你几乎永远需要在C#终结/析构函数.绝对不要开始添加它们,直到你真的,真的知道你需要一个.