我是 Stack Overflow 的新手和新手程序员。我正在尝试在 Visual Studio 2010 C# 中构建其他人的代码作为学习机会。我无法弄清楚为什么我在附加 stub 代码底部的四个类(第 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?)
The code is almost identical to the Employee and Manager classes in Andrew Troelsen’s Pro C# 2005 book in Chapter 4.
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
最佳答案
问题出在这里:
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 Naming Conventions .在这种情况下,您的类(class)应该是:
基本对象
AbstractButtonWidget
AbstractLabelWidget
AbstractScrollbarWidget
...虽然考虑到您的“抽象”类实际上并不是抽象的,但您可能希望对它们重命名更多...而且您的 BasicObject
可能应该是 WidgetBase
(或 AbstractWidget
,实际上是抽象的...)
您的参数应该只是 name
而不是 p_name
。
我还建议将所有字段设为私有(private)(我也会放弃 m_
前缀,但如果该字段是私有(private)的,那那么也不错)- 你可能希望将名称公开为属性。
此外,您几乎从不在 C# 中需要终结器/析构函数。绝对不要开始添加它们,直到您真的、真的知道您需要一个。
关于C# 继承构建错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32976311/