C# 引用訪問權限


同樣代碼表現的不同行為

創建基類(Super)和派生類(Sub)每個類有一個字段field和一個公共方法getField,並且使用內聯的方式初始化為1,方法getField返回字段field。C#和Java代碼及運行結果如下

C#

    class Super
    {
        public int field = 0;

        public int getField()
        {
            return field;
        }
    }

    class Sub : Super
    {
        public int field = 1;

        public int getField()
        {
            return field;
        }
    }

    class Program
    {
        private static void Main(string[] args)
        {
            Super sup = new Sub();
            Console.WriteLine("sup.getField() result:" + sup.getField());
            Console.ReadKey();
        }
    }

 

Java

class Super {
    public int field = 0;
    public int getField() {
        return field;
    }
}

class Sub extends Super {
    public int field = 1;
    public int getField() {
        return field;
    }
}

public class polymorphicDefects {
    public static void main(String[] args) {
        Super sup = new Sub();
        System.out.println("sup.getField() result:" + sup.getField());
    }
}

 

 

Java代碼運行結果表現出了多態性,而C#的方法並沒有表現出多態性。更具體的說C#中對象sub並沒有調用自己實際類型Sub中的方法而是去調用父類的方法。

可能用管了Java的童鞋,突然使用C#在一點上有些許不習慣,其實C#團隊在這里加入了一個概念,就是引用訪問權限,一個引用代表着他的訪問權限,Sub的引用僅能對Sub類型中自己的方法進行訪問。

當然C#的方法不是支持多太,只是使用虛方法來表現方法的多態性,可看下面的例子:

    class Super
    {
        public int field = 0;

        public virtual int getField()
        {
            return field;
        }
    }

    class Sub : Super
    {
        public int field = 1;

        public override int getField()
        {
            return field;
        }
    }

    class Program
    {
        private static void Main(string[] args)
        {
            Super sup = new Sub();
            Console.WriteLine("sup.getField() result:" + sup.getField());
            Console.ReadKey();
        }
    }

 

接下來我想說說我對C#引入引用訪問權限的看法。引入了引用訪問權限的C#比Java更加的強大了,也比Java多了一個新的特性,當然事情都是有兩個方面的,對引用那個訪問權限的引入也使C#更加復雜與不易。

不知道其他童鞋有什么看法沒,可在評論區多交流。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM