2009-06-01 33 views
13

Có thể kế thừa từ lớp Thread và ghi đè lên phương thức Start không?Thừa kế hệ thống.Threading.Thread

+3

Tại sao bạn muốn? Bạn đang cố gắng để thực hiện? –

+0

Tôi muốn đặt tỷ lệ cược khá tốt, anh ấy chỉ muốn chuyển một hoặc nhiều thông số được nhập mạnh vào phương thức của mình. –

+0

Nếu anh ta muốn vượt qua một tham số gõ mạnh mẽ duy nhất, anh ta nên nhìn vào các ParameterizedThreadStartDelegate truyền cho ctor Thread. Bằng cách này, anh ta sẽ nhận được một loại an toàn Bắt đầu quá tải. –

Trả lời

8

Tôi không nghĩ rằng bất kỳ thừa kế có thể dẫn đến một mã dễ đọc hơn này:

Thread myThread = new Thread(() => 
{ 
    //Do what you want... 
}); 
myThread.Start(); 
+0

bên cạnh Thread là một lớp Sealed bạn không thể kế thừa từ Thread –

+2

Với đủ các đối tượng lẻ mà tôi phải gây rối và theo dõi bên trong luồng, nó chắc chắn có thể. Tôi sẽ được viết một thread mà phải tự động tải một DLL và gọi API phương pháp trên nó trong khi trả lời các yêu cầu đến từ mạng. Tôi cần nhiều hơn chỉ là một phương pháp cho chủ đề của tôi; Tôi cần một lớp học. – skiphoppy

2

Không ...

Lớp Thread được bịt kín ...

[ComVisibleAttribute(true)] 
[ClassInterfaceAttribute(ClassInterfaceType.None)] 
public sealed class Thread : CriticalFinalizerObject, 
    _Thread 

Cảm ơn

11

Không, lớp Threadsealed. Lý do đằng sau quyết định này là nó là một trình bao bọc cấp độ khó và cấp thấp xung quanh đối tượng hạt nhân mà bạn không nên gây rối với nó.

Một câu hỏi dành cho bạn, tại sao bạn muốn ghi đè phương thức Bắt đầu? Bạn đang cố gắng đạt được điều gì?

+0

Ditto về lý do tại sao người ta muốn ghi đè Bắt đầu. – jrista

+0

Tôi muốn đặt tỷ lệ cược khá tốt, anh ấy chỉ muốn chuyển một hoặc nhiều thông số được nhập mạnh vào phương thức của mình. –

2

Không có nó là một lớp niêm phong có nghĩa là bạn không thể kế thừa từ nó.

7

Không chắc chắn lý do tại sao bạn có thể muốn thực hiện việc này (hoặc thậm chí phải làm điều này nếu có thể), nhưng có cách để tránh thực tế rằng lớp Threadsealed - sử dụng các phương pháp mở rộng. Về mặt kỹ thuật, nó chỉ thêm một tình trạng quá tải vào nhóm phương thức Start (thay vì ghi đè), nhưng điều đó vẫn có thể hữu ích trong ngữ cảnh của bạn.

Something như thế này có thể là những gì bạn muốn:

public static void Start(this Thread thread, int foo) 
{ 
    // Your code here. 

    thread.Start(); 
} 

Bạn có thể sau đó chỉ cần gọi nó như vậy:

var thread = new Thread(); 
thread.Start(123); 
20

Về lý do tại sao ai đó sẽ muốn làm điều này: rất nhiều ngôn ngữ (ví dụ Java) và/hoặc API (ví dụ Qt) cho phép các nhà phát triển triển khai các luồng bằng cách kế thừa từ một lớp cơ sở "thread", và sau đó quá tải một phương thức thực hiện thường trình luồng. Có sử dụng mô hình này rộng rãi trong Qt, tôi thực sự thấy nó rất tiện dụng - thay vì có chủ đề nhắm mục tiêu một số chức năng hoặc phương pháp, thường dẫn đến mã lạ và/hoặc phức tạp, toàn bộ chuỗi được chứa bên trong của một đối tượng .

Dưới đây là ví dụ mã sử dụng Qt API:

class MyThread : public QThread 
{ 
    Q_OBJECT 

protected: 
    void run(); 
}; 

void MyThread::run() 
{ 
    ...something I need threaded... 
} 

QThread là lớp cơ sở luồng Qt của. Để sử dụng MyThread, tạo một thể hiện của đối tượng thread và gọi QThread :: start(). Mã xuất hiện trong run() reimplementation sau đó sẽ được thực thi trong một luồng riêng biệt.

Điều tốt đẹp về điều này là tôi nghĩ nó cho phép bạn thực sự chứa mọi thứ mà một chủ đề cần trong một đối tượng, và (theo kinh nghiệm của tôi), nó tạo ra một mô hình đối tượng rất mạch lạc. Tôi không nghĩ rằng nó đáp ứng nhu cầu của mọi người, nhưng tôi đã có một chút ngạc nhiên khi C# không có một mô hình luồng cơ bản như vậy để thành thật.

Tôi chắc chắn không mua lớp Chủ đề của C# được niêm phong vì sự phức tạp của hạt nhân; nếu Qt có thể cung cấp một thư viện luồng đa nền tảng cho phép thừa kế của QThread, tôi thấy không có lý do thực sự MSFT không thể cung cấp khả năng tương tự trong một lớp luồng trong C#.

+3

Tôi đồng ý với câu trả lời của bạn và cũng đã sử dụng trong nhiều năm mà loại lớp trừu tượng trong mã C++ của tôi. – Dave

+0

Lý do thực sự là họ muốn có một wrapper mỏng. :) Không có gì ngăn cản bất kỳ ai tạo ra một trình bao bọc tốt hơn xung quanh trình bao bọc mỏng chính thức. – Ekevoo

2

Tôi cũng được sử dụng để sử dụng cùng một logic trong các ứng dụng Java, và nó làm cho cảm giác nghiêm trọng để bó một sợi vào một đối tượng mà sau đó tiếp tục tách bắt đầu của một quá trình mới từ cha mẹ của nó. Tương tự như vậy, C# rất thất vọng không hỗ trợ phương pháp này. Dave P

11
using System.Threading; 

namespace NGrubb.Threading { 

    public abstract class BaseThread { 
     private Thread m_thread; 

     public BaseThread() { 
      m_thread = new Thread(Run); 
     } 

     public void Start() { 
      m_thread.Start(); 
     } 

     protected abstract void Run(); 
    } 
} 
+0

Tôi sẽ không thực sự đặt một lớp ThreadBase như thế này vào codebase của tôi, nhưng điều này làm cho một mẫu tốt đẹp để sử dụng. Cảm ơn! – HappyNomad