2010-08-09 36 views
9

Tôi có thể tạo phiên bản trừu tượng lớp trong C# /. Net như trong Java không?Có một cú pháp để tạo một lớp con ẩn danh trong C# không?

Thông tin bổ sung

Tôi nghĩ rằng rất nhiều người trong chúng ta không hiểu ý tôi là gì? Vì vậy, Trong java Tôi thể tạo lớp trừu tượng như thế này:

Simple lớp trừu tượng:

/** 
* @author jitm 
* @version 0.1 
*/ 
public abstract class TestAbstract 
{ 
    public abstract void toDoSmth(); 
} 

Mã, nơi tôi đã tạo ra thể hiện của lớp trừu tượng

/** 
* @author jitm 
* @version 0.1 
*/ 
public class Main { 
    public static void main(String[] args) { 
     TestAbstract testAbstract = new TestAbstract() { 
      @Override 
      public void toDoSmth() { 
       System.out.println("Call method toDoSmth"); 
      } 
     }; 
    } 
} 

Can I làm trong C# một cái gì đó như thế này?

+6

Hiện tại câu hỏi của bạn là * xa * quá mơ hồ. Đặc biệt, bạn đã đề cập đến các lớp trừu tượng trong tiêu đề và trong các thẻ, nhưng không phải trong phần nội dung của văn bản. Nếu bạn có một đoạn mã Java cụ thể, hãy đăng nó. –

+1

Ông đã đề cập đến một lớp học có tên "Abstact". Có thể có liên quan. –

+0

Không, lớp Tóm tắt bằng trừu tượng :) – jitm

Trả lời

8

Không có trong Java cũng như trong C#, bạn có thể tạo một thể hiện của một lớp trừu tượng. Bạn sẽ luôn cần phải tạo một lớp cụ thể thừa kế từ lớp trừu tượng. Java cho phép bạn thực hiện điều đó mà không cần đặt tên lớp, sử dụng các lớp ẩn danh. C# không cung cấp cho bạn tùy chọn đó.

(Edited để hiển thị một delegate như một sự thay thế. Tôi không có quyền truy cập vào VS đây, vì vậy nó có thể không biên dịch, nhưng đây là ý tưởng)

Thông thường trong Java khi bạn sử dụng một lớp trừu tượng với một phương thức trừu tượng duy nhất (SAM) những gì bạn đang thực sự cố gắng đạt được là truyền một số mã dưới dạng tham số. Giả sử bạn cần sắp xếp một mảng các đối tượng dựa trên tên lớp, sử dụng Bộ sưu tập.loại (Collection, Comparator) (Tôi biết Comparator là một giao diện, nhưng nó là ý tưởng giống nhau) Sử dụng một lớp ẩn danh để tránh phụ đánh máy, bạn có thể viết một cái gì đó giống như

Comparator<Object> comparator = new Comparator<Object>{ 
     @Override 
     public int compare(Object o1, Objecto2) { 
      return o1.getClass().getSimpleName().compareTo(o2.getClass().getSimpleName())); 
     }//I'm not checking for null for simplicity 
    } 
    Collections.sort(list, comparator) 

Trong C# 2.0 và xa hơn nữa bạn có thể thực hiện khá nhiều điều tương tự bằng cách sử dụng đại biểu Comparison<T>. Một đại biểu có thể được coi là một đối tượng hàm, hoặc trong các từ java, một lớp với một phương thức duy nhất. Bạn thậm chí không cần phải tạo một lớp, mà chỉ là một phương thức sử dụng đại biểu từ khóa.

Comparison<Object> comparison = delegate(Object o1, Object o2) 
{ 
    return o1.class.Name.CompareTo(o2.class.Name);   
}; 

list.sort(comparison); 

Trong C# 3.0 và xa hơn nữa bạn có thể viết thậm chí còn ít mã sử dụng lambdas và suy luận kiểu:

list.sort((o1, o2) => o1.class.Name.CompareTo(o2.class.Name)) 

Dù sao, nếu bạn đang chuyển mẫu mã java để C# bạn nên đọc về các đại biểu ... trong nhiều trường hợp, bạn sẽ sử dụng các đại biểu thay vì các lớp ẩn danh. Trong trường hợp của bạn, bạn đang sử dụng một phương thức void toDoSmth(). Có một đại biểu được gọi là Hành động mà là khá nhiều điều tương tự, một phương pháp không có tham số và không có trở lại.

+0

Vâng, câu hỏi của tôi là tôi có thể tạo ví dụ như trong java (sử dụng ẩn danh) hiện tại tôi hiểu rằng tôi không thể. Cảm ơn. – jitm

+2

Trong một số trường hợp (nhiều nhất?), Bạn nên thay thế các lớp ẩn danh với các đại biểu và bạn sẽ viết mã ít hơn ... Đặc biệt với một lớp phương thức. –

+0

2 Pablo: Bạn có thể đăng ví dụ làm thế nào để làm điều đó, bởi vì hiện tại tôi đã tạo ra lớp đơn giản từ trừu tượng và sử dụng nó. – jitm

8

No. Không trực tiếp. Gần nhất bạn có thể đến (giả sử bạn có cấu trúc lớp sau):

public abstract class AbstractClass 
{ 
} 

public class ChildClass : AbstractClass 
{ 
} 

là:

AbstractClass instance = new ChildClass(); 
0

Nếu bạn đang nói về một lớp trừu tượng, câu trả lời là không. Họ là gần giống như giao diện, nhưng cho phép triển khai sau đó có thể được sử dụng bởi một đối tượng cụ thể .. Bạn phải tạo ra một lớp bê tông mà kế thừa từ lớp trừu tượng

Xem thêm tại Abstract Classes

+0

Vui lòng không đăng liên kết .NET 1.1! –

0

Không, bạn không thể - đó là lý do lớp được gọi là trừu tượng. Bạn có thể bắt nguồn từ nó và do đó tạo ra các lớp được triển khai cụ thể mà bạn có thể khởi tạo.

0

Điều bạn đang hỏi là một chút khó hiểu. Nếu bạn đang yêu cầu nếu bạn có thể tạo một thể hiện của một lớp, thì tất nhiên bạn có thể. Tại sao ngôn ngữ C# hoặc bất kỳ ngôn ngữ nào cho phép bạn có thể định nghĩa một lớp, nhưng không thể khởi tạo nó?

Nếu bạn hỏi xem bạn có thể tạo một thể hiện của lớp trừu tượng không, câu trả lời là không. Bạn phải lấy được một lớp mới từ lớp trừu tượng, sau đó khởi tạo lớp mới.

-1

C# giống với Java trong trường hợp này, bạn không thể khởi tạo lớp trừu tượng.

+0

Trong Java tôi có thể, chỉ có tôi cần nó là thực hiện phương pháp trừu tượng, nhưng, tôi có thể làm điều đó như thực hiện ẩn danh. – jitm

+0

Trong trường hợp đó, sau đó không - C# (theo như tôi biết không cho phép bạn tạo ra một thực hiện ẩn danh của một lớp trừu tượng). – RQDQ

+0

Bạn vẫn không instantiating lớp trừu tượng, bạn đang instantiating một phân lớp ẩn danh. – Struan

Các vấn đề liên quan