標籤:style blog http color ar 使用 sp java div
同樣代碼錶現的不同行為
建立基類(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#更加複雜與不易。
不知道其他童鞋有什麼看法沒,可在評論區多交流。
C# 引用存取權限