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
问题就在这里:
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)
{
}
}
其他建议:
- 去掉空的"析构函数"。在c#中很少需要它(在某些上下文中称为"终结器")
- 阅读命名标准。c#是区分大小写的,所以驼峰大小写比下划线分隔要好。