C# 继承构建错误

标签 c#

我是 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/

相关文章:

c# - 重新加载实体和所有导航属性关联 - DbSet Entity Framework

c# - 不断检查 SQL Server 连接的标准方法是什么?

c# MailKit - 阅读回执

C#/Mono - 从控制台应用程序读取输出

c# - 如何在.NET 中读取包含 Unicode 的 xml 文本文件,然后将其保存到数据库中?

c# - 在 C# 'switch' 语句中更改变量

c# - 'throw' 和 'throw new Exception()' 之间的区别

c# - 你如何使用 SqlDataRecord 处理 Nullable 类型

c# - Azure Function 使用 Azure Key Vault 本地开发的连接

C# Web Api - IValidatableObject validationContext 服务提供者为空