2017-02-18 39 views
-4

我想在C#中使用Java風格的多態。可能嗎?C#中的Java風格多態?

這裏是不編譯

using System; 

namespace HelloWorld 
{ 
public class Program 
{ 
    public static void Main (string[] args) 
    { 
     Triangle triangle = new Triangle(2); 
     Square square = new Square(3); 
     printID(square); 
    } 

    public void printID(Shape s){ 
      Console.WriteLine ("id is " + s.id); 
    } 
} 

public class Shape{ 
     public int id; 
} 

public class Triangle: Shape{ 
     float b; 
     float height; 

     float area(){ 
      return b*height/2; 
     } 

     public Triangle(int k){ 
      id=k; 
     } 
} 

public class Square: Shape{ 
     float side; 

     float area(){ 
      return side*side; 
     } 

     public Square(int k){ 
       id=k; 
     } 

} 
} 

該消息是

MyClass.cs一個例子(11,4):錯誤CS0120:一個對象引用需要訪問非靜態成員`HelloWorld.Program.printID(HelloWorld.Shape)'

謝謝!

+0

哦,我的,這是尷尬的,謝謝謝爾蓋。現在工作正常 – Iodizer

回答

6

錯誤與多態性無關 - 您正在從靜態方法Main調用非靜態方法。你應該使printID也是靜態的。

public static void printID(Shape s){ 
    Console.WriteLine("id is " + s.id); 
} 

此外,我建議你:

  • 堅持用C#命名規則,當你正在編寫C#代碼。方法和屬性應該有PascalCase名稱。
  • 使用屬性,而不是公共領域
  • 如果任何形狀應該有和id,可以考慮通過: base(id)
  • 建立在基類public Shape(int id)構造,並呼籲從派生類的構造函數提高命名 - 如果你逝去的ID,然後調用變量id而不是k