簡體   English   中英

C#繼承構建錯誤

[英]C# inheritance build errors

我是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的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的方法來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#中很少需要(在某些情況下稱為“ finalizer”)
  2. 閱讀有關命名標准的信息 C#區分大小寫,因此駝峰式大小寫優先於下划線分隔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM