1. 程式人生 > 實用技巧 >C# base、this、new、override、abstract梳理

C# base、this、new、override、abstract梳理

一、Base關鍵詞的幾種用法

base重要用於OOP的多型上,base關鍵字用於在派生類中實現對基類公有或者受保護成員的訪問,但是隻侷限在建構函式、例項方法和例項屬性訪問器中

1、base呼叫基類建構函式

using System;

namespace BaseDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            B b = new B();
            Console.ReadLine();
        }
    }
    public class
A { public A() { Console.WriteLine("Build A"); } } public class B : A { public B() : base() { Console.WriteLine("Build B"); } } }

執行結果:

2、base在派生類中呼叫基類的方法

using System;

namespace BaseDemo
{
    class Program
    {
        
static void Main(string[] args) { B b = new B(); b.Hello(); Console.ReadLine(); } } public class A { public virtual void Hello() { Console.WriteLine("Hello"); } } public class B : A {
public override void Hello() { base.Hello(); } } }

執行結果:

二、this關鍵字

1、this代表當前類的例項物件

using System;

namespace thisDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            A a = new A();
            a.GetName();
            Console.ReadKey();
        }
    }
    public class A
    {
        private string name = "qxh";
        public void GetName()
        {
            string name = "歡迎你";
            // this代表A的例項物件
            // 所以this.name對應的是"qxh"
            // name對應的是GetName方法內的區域性變數
            Console.WriteLine($" {this.name} - {name}");
        }
    }
}

執行結果:

2、用this串聯建構函式

using System;

namespace thisDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            A a = new A("qxh");
            Console.ReadKey();
        }
    }
    public class A
    {
        public A()
        {
            Console.WriteLine("無參建構函式");
        }
        // this()對應無參構造方法A()
        // 先執行A(),後執行A(string text)
        public A(string text) : this()
        {
            Console.WriteLine(text);
            Console.WriteLine("有參建構函式");
        }
    }
}

執行結果:

3、擴充套件方法

using System;

namespace thisDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            string name = "qxh";
            Console.WriteLine(name.ShowInfo("歡迎你"));

            Console.ReadKey();
        }
    }
    /// <summary>
    /// 必須是靜態類
    /// </summary>
    public static class A
    {
        public static string ShowInfo(this string str, string info)
        {
            return $"{str}-{info}";
        }
    }
}

執行結果:

4、索引器:引數可以是int,也可以是string等其他型別

using System;

namespace thisDemo
{
    class Program
    {
        static void Main(string[] args)
        {

            A a = new A();
            Console.WriteLine(a["qxh"]);
            Console.ReadKey();
        }
    }
    public class A
    {
        public string Name { get; set; }
        //索引器  []括號裡面可以是string,int,array等
        public string this[string index]
        {
            get
            {
                if (index == "qxh")
                {
                    return index;
                }
                else
                {
                    return "gg";
                }
            }
            set
            {
                Name = value;
            }
        }
    }
}

執行結果:

三、New關鍵字

1、new運算子:用於建立物件和呼叫建構函式

(1)特點

  • new一個class時,new完成了以下兩個方面的內容:一是呼叫new class命令來為例項在託管堆中分配記憶體;二是呼叫建構函式來實現物件初始化。
  • new一個struct時,new運算子用於呼叫其帶建構函式,完成例項的初始化。
  • new一個int時,new運算子用於初始化其值為0。
  • new運算子不可過載。
  • new分配記憶體失敗,將引發OutOfMemoryException異常。

(2)demo

static void Main(string[] args)
{
    A a = new A();//new操作符 建立物件和呼叫建構函式          
    Console.ReadKey();
}

2、new修飾符:new關鍵字可以顯式隱藏從基類繼承的成員

new關鍵字可以顯式隱藏從基類繼承的成員。隱藏繼承的成員時,該成員的派生版本將替換基類版本。雖然可以在不使用new修飾符的情況下隱藏成員,但會生成警告。如果使new顯式隱藏成員,則會取消此警告,並記錄要替換為派生版本這一事實。下面是隱藏 A中的Name屬性

public class A
{
    public string Name { get; set; } = "qxh";
}

public class B : A
{
    new public string Name { get; set; } = "dachong";
}

3、new約束:用於在泛型宣告中約束可能用作型別引數的引數的型別

new 約束指定泛型類宣告中的任何型別引數都必須有公共的無引數建構函式。 如果要使用 new 約束,則該型別不能為抽象型別。當與其他約束一起使用時,new()約束必須最後指定:

public class A<T>where T : IComparable, new()
{
        ////
}

四、override關鍵字

要擴充套件或修改繼承的方法、屬性、索引器或事件的抽象實現或虛實現,必須使用 override 修飾符。由 override 宣告重寫的方法稱為重寫基方法。 重寫的基方法必須與 override 方法具有相同的簽名。不能重寫非虛方法或靜態方法。重寫的基方法必須是virtual、abstract或override的。用關鍵字 virtual 修飾的方法,叫虛方法。可以在子類中用override 宣告同名的方法,這叫“重寫”。相應的沒有用virtual修飾的方法,我們叫它實方法。

using System;

namespace thisDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            B b = new B();
            b.Show();
            Console.ReadKey();
        }
    }
    public class A
    {
        public virtual void Show()
        {
            Console.WriteLine("A");
        }
    }

    public class B : A
    {
        public override void Show()
        {
            Console.WriteLine("B");
        }
    }
}

執行結果:

五、abstract關鍵字

  • 用關鍵字abstract定義的類即為抽象類,且只能作為基類,也不能被例項化。
  • 用abstract定義的類不一定包含抽象方法,也可以包含非抽象方法。
  • abstract定義的方法一定包含在抽象類中。
  • 抽象類不能定義為密封類(sealed),抽象方法不能使用virtual、static、private修飾符
  • 如果派生類沒有實現所有的抽象方法,則該派生類也必須宣告為抽象類。