溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

面向對象學習之二:繼承

發布時間:2020-10-07 00:19:23 來源:網絡 閱讀:815 作者:yuan469 欄目:編程語言

面向對象學習之二:繼承

1、成員的可訪問性:

訪問修飾符

意義

public

成員定義范圍的外部和內部都是完全可見的,即對公共成員的訪問不受限制。

protected

成員僅對定義類及其派生類可見。

internal

成員在包含它的程序集內部的任何地方可見,這包括定義在類以及程序集內定義類之外的任何范圍。

private

成員只在定義類內可見,這是最嚴格的訪問形式,是類成員默認的訪問級別。

2、成員隱藏:

   繼承可以擴展功能,但不能移除功能,例如,基類里可用的公共方法,在派生類及派生類的派生類的實例里都是可用的。不能從派生類中移除這些功能。請看下面代碼:

namespace 隱藏成員
{
    public class A
    {
        public void DoSomething()
        {
            Console.WriteLine("A.DoSomething");
        }
    }
    public class B : A
    {
        public new void DoSomething()
        {
            Console.WriteLine("B.DoSomething");
        }
        public void DoSomethingElse()
        {
            Console.WriteLine("B.DoSomethingElse");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            B b = new B();
            b.DoSomething();
            b.DoSomethingElse();
            A a = b;
            a.DoSomething();
            Console.ReadKey();
        }
    }
}


分析:

程序運行結果為:

面向對象學習之二:繼承

   雖然類B隱藏了類A的DoSomething實現,但并沒有移除它,只是在通過B引用來調用的時候隱藏了。在Main方法中可以看到,可以輕松的繞過這一點。通過隱式轉換把B實例引用轉換成A實例引用,就可以通過A實例引用來調用A.dosomething的實現。因此A.dosomething并沒有丟掉,而是隱藏了,需要多做一點工作來找到它。


3、override和new方法:

在派生類中重寫方法,必須用override修飾符來標記方法。否則,編譯器會提示警告,要求在派生方法中提供new修飾符或override。而且,編譯器默認使用new修飾符,看看下面的代碼:

namespace 繼承和虛方法
{
    public class A
    {
        public virtual void SomeMethod()
        {
            Console.WriteLine("A.SomeMethod");
        }
    }
    public class B : A
    {
        public void SomeMethod()
        {
            Console.WriteLine("B.SomeMethod");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            B b = new B();
            A a = b;
            a.SomeMethod();
            Console.ReadLine();
        }
    }
}

分析:

運行結果是:調用A.SomeMethod。

New關鍵字打破了這個層次結構中的虛函數鏈。當一個虛方法通過對象引用調用的時候,調用的方法取決于運行時的方法表,如果方法是虛的,運行時會搜索層次結構尋找方法在繼承體系中最底層的派生版本,然后調用它(這里是類B)。但是,如果在搜索過程中遇到一個標有new修飾符的方法,它會退回繼承體系中的上一級類(這里是類A),并使用這個類中的方法。由于C#在new和override都不存在的情況下默認使用new修飾符,這就是為什么A.SomeMethod被調用的原因。

   如果B.SomeMethod標記為override,這段代碼就會調用B.SomeMethod。


4、Base關鍵字:base允許訪問一個實例的基類實現,看看下面代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 繼承
{
    public class A
    {
        private int x;
        public A(int var)
        {
            this.x = var;
        }
        public virtual void DoSomething()
        {
            Console.WriteLine("A.DoSomething");
        }
    }
    public class B : A
    {
        public B():base(123)
        {
                                                                           
        }
        public override void DoSomething()
        {
            Console.WriteLine("B.DoSomething");
            base.DoSomething();
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            B b = new B();
            b.DoSomething();
            Console.ReadKey();
        }
    }
}

分析:

本例中可以看到兩處使用base關鍵字,

  第2個地方是B.DoSomething實現,在類B的實現中,實現B.DoSomething的時候借用類A中的A.DoSomething實現,因此,可以在B.DoSomething實現內通過base關鍵字直接調用A.DoSomething。

通常,調用實例的虛方法會調用虛方法最底層的實現,也就是B.DoSomething。但是,如果通過base關鍵字調用,就會調用基類最底層的的派生方法。因為A是基類,A.DoSomething是DoSomething相對于類A的基類方法,因此base.DoSomething就會調用A.DoSomething。這樣可以實現一個重寫方法,同時借用基類的實現。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女