NET中const、readonly、sealed與JAVA中final的差異

NET中const、readonly、sealed與JAVA中final的差異

NET
const:常量,可以是全局或局部,定義(聲明)同時賦值,就是說在定義時必須初始化。
readonly: 只讀,只能是全局,可以在定義的時候賦值,也可以只定義,然後在構造函數中初始化。
sealed: 密封,修飾類,表示不能被派生類繼承,可以用於基類。
sealed: 密封,修飾方法,表示該方法不能被子類的方法覆蓋,子類若是繼承該方法,則必須添加關鍵字new,進行重寫。不可以用於基類中,因爲基類中的方法不能定義爲override,只能用於繼承類中,比如B:A,B類中的方法public sealed override void F()。C:B,這樣C類中的方法就不能覆蓋public override void F(),而只能是重寫public new void F()。

JAVA
final:常量,可以是全局或局部,初始化可以在定義時或在構造函數中任意一處,二選一。
final: 修飾方法的形式參數, 這個形式參數值在該方法體內不可以被改變,否則會產生編譯錯誤。
final: 修飾類,跟NET的sealed作用相同。
final: 修飾方法,和NET的sealed類似,但和NET不同的是,final可以用於基類中的方法。

經過上面比較,感覺NET在關鍵字定義這裏把事情搞複雜了,而JAVA只用了final全部搞定。

下面我們來看下示例代碼,這裏主要講解sealed關鍵字用法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

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

            A a = new A("A紳士");
            a.F();

            B b = new B("B女士");
            b.F();

            C c = new C("C小姐1");
            c.F();

            D d = new D("D青年");
            d.F();

            Console.WriteLine();

            A ab = new B("B女士");
            ab.F();

            A ac = new C("C小姐2");
            ac.F();

            B bc = new C("C小姐3");
            bc.F();
        }
    }

    class A
    {
        //protected string name;
        public A(string name)
        {
            //this.name = name;
            //Name = "Mr.Alan";
            Name = name;
        }

        public virtual string Name { get; set; }

        //public sealed virtual void F() //錯誤 CS0238 因爲“A.F()”不是重寫,所以無法將其密封

        public virtual void F()
        {
            Console.WriteLine("[A]" + Name + ": " + "Hello,我是艾倫先生!");
        }
    }

    class B : A
    {
        public B(string name) : base(name)
        {
            //Name = "Mrs.Betty";
            Name = name;
        }

        public override string Name { get; set; }

        //public sealed new void F() //錯誤 CS0238  因爲“B.F()”不是重寫,所以無法將其密封

        public sealed override void F()
        {
            Console.WriteLine("[B]" + Name + ": " + "Hum,我是貝蒂.艾倫,請叫我艾倫夫人,這裏我說了算!");
        }
    }

    sealed class C : B
    {
        public C(string name) : base(name)
        {
            //Name = "Miss.Cora";   //"Ms.Cheryl"
            Name = name;
        }

        public override string Name { get; set; }

        //public override void F() //錯誤 CS0239  “C.F()”: 繼承成員“B.F()”是密封的,無法進行重寫

        public new void F()
        {
            Console.WriteLine("[C]"+Name + ": " + "Hi,我是歌手,請叫我科拉小姐!");
        }
    }

    //class D : C //錯誤  CS0509   “D”: 無法從密封類型“C”派生
    class D
    {
        public D(string name) //: base(name)
        {
            //Name = "Mr.David";
            Name = name;
        }

        public string Name { get; set; }

        public void F()
        {
            Console.WriteLine("[D]" + Name + ": " + "Hello,我是樂手,請叫我大衛!");
        }
    }
}

代碼輸出:
[A]A紳士: Hello,我是艾倫先生!
[B]B女士: Hum,我是貝蒂.艾倫,請叫我艾倫夫人,這裏我說了算!
[C]C小姐1: Hi,我是歌手,請叫我科拉小姐!
[D]D青年: Hello,我是樂手,請叫我大衛!

[B]B女士: Hum,我是貝蒂.艾倫,請叫我艾倫夫人,這裏我說了算!
[B]C小姐2: Hum,我是貝蒂.艾倫,請叫我艾倫夫人,這裏我說了算!
[B]C小姐3: Hum,我是貝蒂.艾倫,請叫我艾倫夫人,這裏我說了算!

注意第C小姐2和C小姐3的發言被B女士的發言取代了,因爲是sealed方法。

版權所有,轉載請註明文章出處 http://blog/csdn.net/cadenzasolo

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章