sách gpt4 ăn đã đi

Kết hợp với khung .net để kích hoạt các sự kiện của lớp cơ sở và triển khai các sự kiện giao diện trong các lớp dẫn xuất C#

In lại Tác giả: qq735679552 Thời gian cập nhật: 27-09-2022 22:32:09 29 4
mua khóa gpt4 giày nike

CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.

Bài viết blog CFSDN này kết hợp khung .net để kích hoạt các sự kiện lớp cơ sở và các sự kiện giao diện triển khai trong các lớp dẫn xuất C#. Nó được tác giả sưu tầm và biên soạn. Nếu bạn quan tâm đến bài viết này, hãy nhớ thích nó.

Tạo ra các sự kiện của lớp cơ sở trong lớp dẫn xuất Ví dụ đơn giản sau đây minh họa cách khai báo các sự kiện tiêu chuẩn trong lớp cơ sở có thể được tạo ra từ một lớp dẫn xuất. Mẫu này được sử dụng rộng rãi cho các lớp Windows Forms trong thư viện lớp .NET Framework. Khi tạo các lớp có thể được sử dụng làm lớp cơ sở cho các lớp khác, bạn nên xem xét thực tế rằng sự kiện là loại đại biểu đặc biệt chỉ có thể được gọi từ lớp mà chúng được khai báo. Các lớp dẫn xuất không thể gọi trực tiếp các sự kiện được khai báo trong lớp cơ sở. Mặc dù đôi khi các sự kiện chỉ được tạo ra bởi lớp cơ sở, nhưng trong hầu hết các trường hợp, các lớp dẫn xuất phải được phép gọi các sự kiện của lớp cơ sở. Để thực hiện việc này, bạn tạo một phương thức gọi được bảo vệ trong lớp cơ sở có chứa sự kiện. Các lớp dẫn xuất có thể gọi sự kiện một cách gián tiếp bằng cách gọi hoặc ghi đè phương thức gọi này. Lưu ý: Không khai báo các sự kiện ảo trong lớp cơ sở và không ghi đè các sự kiện này trong lớp dẫn xuất. Trình biên dịch C# không thể xử lý chính xác các sự kiện này và không thể dự đoán liệu người dùng của sự kiện dẫn xuất có thực sự đăng ký vào sự kiện lớp cơ sở hay không.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
không gian tên Sự kiện BaseClass
{
   sử dụng Hệ thống;
   sử dụng Hệ thống.Bộ sưu tập.Chung;
 
   // Lớp EventArgs đặc biệt để lưu trữ thông tin về Hình dạng.
   công cộng lớp học ShapeEventArgs: Sự kiệnArgs
   {
     riêng tư gấp đôi khu vực mới;
 
     công cộng ShapeEventArgs( gấp đôi ngày)
     {
       khu vực mới = d;
     }
     công cộng gấp đôi Khu vực mới
     {
       lấy { trở lại khu vực mới; }
     }
   }
 
   // Nhà xuất bản sự kiện lớp cơ sở
   công cộng tóm tắt lớp học Hình dạng
   {
     được bảo vệ gấp đôi khu vực;
 
     công cộng gấp đôi Khu vực
     {
       lấy { trở lại khu vực; }
       bộ { diện tích = giá trị; }
     }
     // Sự kiện. Lưu ý rằng bằng cách sử dụng loại sự kiện EventHandler chung
     // chúng ta không cần phải khai báo một kiểu đại biểu riêng biệt.
     công cộng sự kiện EventHandler Thay đổi hình dạng;
 
     công cộng tóm tắt vô hiệu Vẽ tranh();
 
     //Phương thức gọi sự kiện mà các lớp dẫn xuất có thể ghi đè.
     được bảo vệ ảo vô hiệu OnShapeChanged(ShapeEventArgs và)
     {
       // Tạo một bản sao tạm thời của sự kiện để tránh khả năng
       // một tình huống chạy đua nếu người đăng ký cuối cùng hủy đăng ký
       // ngay sau khi kiểm tra null và trước khi sự kiện được kích hoạt.
       Trình xử lý EventHandler = ShapeChanged;
       nếu như (người xử lý != vô giá trị )
       {
         người xử lý( cái này , đ);
       }
     }
   }
 
   công cộng lớp học Hình tròn: Hình dạng
   {
     riêng tư gấp đôi bán kính;
     công cộng Vòng tròn( gấp đôi ngày)
     {
       bán kính = d;
       diện tích = 3,14 * bán kính * bán kính;
     }
     công cộng vô hiệu Cập nhật( gấp đôi ngày)
     {
       bán kính = d;
       diện tích = 3,14 * bán kính * bán kính;
       TrênShapeChanged( mới ShapeEventArgs(diện tích));
     }
     được bảo vệ ghi đè vô hiệu OnShapeChanged(ShapeEventArgs và)
     {
       // Thực hiện bất kỳ xử lý cụ thể nào cho vòng tròn ở đây.
 
       // Gọi phương thức gọi sự kiện của lớp cơ sở.
       căn cứ .OnShapeChanged(e);
     }
     công cộng ghi đè vô hiệu Vẽ tranh()
     {
       Console.WriteLine( "Vẽ một vòng tròn" );
     }
   }
 
   công cộng lớp học Hình chữ nhật: Hình dạng
   {
     riêng tư gấp đôi chiều dài;
     riêng tư gấp đôi chiều rộng;
     công cộng Hình chữ nhật( gấp đôi chiều dài, gấp đôi chiều rộng)
     {
       cái này .length = chiều dài;
       cái này .width = chiều rộng;
       diện tích = chiều dài * chiều rộng;
     }
     công cộng vô hiệu Cập nhật( gấp đôi chiều dài, gấp đôi chiều rộng)
     {
       cái này .length = chiều dài;
       cái này .width = chiều rộng;
       diện tích = chiều dài * chiều rộng;
       TrênShapeChanged( mới ShapeEventArgs(diện tích));
     }
     được bảo vệ ghi đè vô hiệu OnShapeChanged(ShapeEventArgs và)
     {
       // Thực hiện bất kỳ xử lý nào cụ thể cho hình chữ nhật ở đây.
 
       // Gọi phương thức gọi sự kiện của lớp cơ sở.
       căn cứ .OnShapeChanged(e);
     }
     công cộng ghi đè vô hiệu Vẽ tranh()
     {
       Console.WriteLine( "Vẽ hình chữ nhật" );
     }
 
   }
 
   // Biểu diễn bề mặt mà các hình dạng được vẽ
   // Đăng ký các sự kiện hình dạng để nó biết
   // khi nào thì vẽ lại một hình dạng.
   công cộng lớp học Hình dạngContainer
   {
     Danh sách _list;
 
     công cộng Hình dạng Container()
     {
       _danh sách = mới Danh sách();
     }
 
     công cộng vô hiệu AddShape(Hình dạng)
     {
       _list.Thêm(s);
       // Đăng ký sự kiện lớp cơ sở.
       s.ShapeChanged += Xử lýShapeChanged;
     }
 
     // ...Các phương pháp khác để vẽ, thay đổi kích thước, v.v.
 
     riêng tư vô hiệu Xử lý hình dạng thay đổi( sự vật người gửi, ShapeEventArgs e)
     {
       Hình dạng s = (Hình dạng)người gửi;
 
       // Thông báo chẩn đoán nhằm mục đích trình diễn.
       Console.WriteLine( "Đã nhận sự kiện. Diện tích hình dạng hiện là {0}" , e.NewArea);
 
       // Vẽ lại hình dạng ở đây.
       s. Vẽ();
     }
   }
 
   lớp học Bài kiểm tra
   {
 
     tĩnh vô hiệu Chủ yếu( sợi dây [] đối số)
     {
       //Tạo nhà xuất bản sự kiện và người đăng ký
       Hình tròn c1 = mới Hình tròn(54);
       Hình chữ nhật r1 = mới Hình chữ nhật(12, 9);
       ShapeContainer sc = mới ShapeContainer();
 
       // Thêm các hình dạng vào vùng chứa.
       sc.AddShape(c1);
       sc.AddShape(r1);
 
       // Gây ra một số sự kiện được nêu ra.
       c1.Cập nhật(57);
       r1.Cập nhật(7, 7);
 
       // Giữ cửa sổ bảng điều khiển mở ở chế độ gỡ lỗi.
       Hệ thống.Console.WriteLine( "Nhấn phím bất kỳ để thoát." );
       System.Console.ReadKey();
     }
   }
}

Đầu ra:

?
1
2
3
4
Đã nhận sự kiện. Diện tích hình dạng hiện là 10201.86
Vẽ một vòng tròn
Đã nhận sự kiện. Diện tích hình dạng hiện là 49
Vẽ một hình chữ nhật

Triển khai các sự kiện giao diện.

Giao diện có thể khai báo sự kiện. Ví dụ sau đây cho thấy cách triển khai các sự kiện giao diện trong một lớp. Các quy tắc triển khai các sự kiện giao diện về cơ bản giống như quy tắc triển khai bất kỳ phương thức hoặc thuộc tính giao diện nào. Triển khai các sự kiện giao diện trong một lớp Khai báo sự kiện trong lớp và sau đó gọi sự kiện đó trong vùng thích hợp.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
không gian tên Triển khaiGiao diệnSự kiện
{
   công cộng giao diện Đối tượng vẽ
   {
     sự kiện Trình xử lý sự kiện ShapeChanged;
   }
   công cộng lớp học MyEventArgs: Sự kiệnArgs
   {
     // thành viên lớp
   }
   công cộng lớp học Hình dạng: IDrawingObject
   {
     công cộng sự kiện Trình xử lý sự kiện ShapeChanged;
     vô hiệu Thay đổi hình dạng()
     {
       // Làm gì đó ở đây trước sự kiện…
 
       TrênShapeChanged( mới Sự kiện của tôi /*đối số*/ ));
 
       // hoặc làm gì đó ở đây sau sự kiện.
     }
     được bảo vệ ảo vô hiệu OnShapeChanged(MyEventArgs e)
     {
       nếu như (Đã thay đổi hình dạng != vô giá trị )
       {
         Hình dạng đã thay đổi( cái này , đ);
       }
     }
   }
 
}

Ví dụ sau đây cho thấy cách xử lý tình huống bất thường khi lớp của bạn kế thừa từ nhiều hơn hai giao diện, mỗi giao diện chứa các sự kiện có cùng tên). Trong trường hợp này, bạn cần cung cấp cách triển khai giao diện rõ ràng cho ít nhất một trong các sự kiện. Khi viết phần triển khai giao diện rõ ràng cho các sự kiện, bạn phải viết thêm và xóa các trình truy cập sự kiện. Hai trình truy cập sự kiện này thường được trình biên dịch cung cấp, nhưng trong trường hợp này trình biên dịch không thể cung cấp. Bạn có thể cung cấp trình truy cập của riêng mình để chỉ định xem hai sự kiện được thể hiện bởi cùng một sự kiện trong lớp của bạn hay bởi các sự kiện khác nhau. Ví dụ: nếu các sự kiện được đưa ra vào các thời điểm khác nhau tùy theo đặc tả giao diện, bạn có thể liên kết từng sự kiện với một triển khai riêng trong lớp. Trong ví dụ sau, người đăng ký xác định sự kiện OnDraw nào sẽ nhận được bằng cách truyền tham chiếu hình dạng tới IShape hoặc IdrawObject.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
không gian tên Sự kiện WrapTwoInterface
{
   sử dụng Hệ thống;
 
   công cộng giao diện Đối tượng vẽ
   {
     // Nâng sự kiện này lên trước khi vẽ
     // đối tượng.
     sự kiện Trình xử lý sự kiện OnDraw;
   }
   công cộng giao diện iShape
   {
     // Nâng sự kiện này lên sau khi vẽ
     // hình dạng.
     sự kiện Trình xử lý sự kiện OnDraw;
   }
 
 
   // Sự kiện lớp cơ sở nhà xuất bản kế thừa hai
   // giao diện, mỗi giao diện có một sự kiện OnDraw
   công cộng lớp học Hình dạng: IDrawingObject, IShape
   {
     // Tạo một sự kiện cho mỗi sự kiện giao diện
     sự kiện Trình xử lý sự kiện PreDrawEvent;
     sự kiện Trình xử lý sự kiện PostDrawEvent;
 
     sự vật objectLock = mới Sự vật();
 
     // Cần triển khai giao diện rõ ràng.
     // Liên kết sự kiện của IDrawingObject với
     // Sự kiện vẽ trước
     sự kiện Trình xử lý sự kiện IDrawingObject.OnDraw
     {
       thêm vào
       {
         khóa (khóa đối tượng)
         {
           PreDrawEvent += giá trị;
         }
       }
       di dời
       {
         khóa (khóa đối tượng)
         {
           PreDrawEvent -= giá trị;
         }
       }
     }
     // Cần triển khai giao diện rõ ràng.
     // Liên kết sự kiện của IShape với
     // Sự kiện PostDraw
     sự kiện Trình xử lý sự kiện IShape.OnDraw
     {
       thêm vào
       {
         khóa (khóa đối tượng)
         {
           PostDrawEvent += giá trị;
         }
       }
       di dời
       {
         khóa (khóa đối tượng)
         {
           PostDrawEvent -= giá trị;
         }
       }
 
 
     }
 
     // Để đơn giản, phương pháp này
     // triển khai cả hai giao diện.
     công cộng vô hiệu Vẽ tranh()
     {
       // Phát sinh sự kiện của IDrawingObject trước khi đối tượng được vẽ.
       Trình xử lý EventHandler = PreDrawEvent;
       nếu như (người xử lý != vô giá trị )
       {
         người xử lý( cái này , mới Sự kiệnArgs());
       }
       Console.WriteLine( "Vẽ một hình dạng." );
 
       // Sự kiện của RaiseIShape sau khi đối tượng được vẽ.
       xử lý = PostDrawEvent;
       nếu như (người xử lý != vô giá trị )
       {
         người xử lý( cái này , mới Sự kiệnArgs());
       }
     }
   }
   công cộng lớp học Người đăng ký1
   {
     // Tham chiếu đối tượng hình dạng như một IDrawingObject
     công cộng Subscriber1(Hình dạng hình dạng)
     {
       IDrawingObject d = (IDrawingObject)hình dạng;
       d.OnDraw += mới Trình xử lý sự kiện(d_OnDraw);
     }
 
     vô hiệu d_TrênVẽ( sự vật người gửi, EventArgs e)
     {
       Console.WriteLine( "Sub1 nhận sự kiện IDrawingObject." );
     }
   }
   // Tham chiếu đối tượng hình dạng như một IShape
   công cộng lớp học Người đăng ký2
   {
     công cộng Subscriber2(Hình dạng hình dạng)
     {
       IShape d = (IShape)hình dạng;
       d.OnDraw += mới Trình xử lý sự kiện(d_OnDraw);
     }
 
     vô hiệu d_TrênVẽ( sự vật người gửi, EventArgs e)
     {
       Console.WriteLine( "Sub2 nhận được sự kiện IShape." );
     }
   }
 
 
   công cộng lớp học Chương trình
   {
     tĩnh vô hiệu Chủ yếu( sợi dây [] đối số)
     {
       Hình dạng hình dạng = mới Hình dạng();
       Người đăng ký1 đăng ký = mới Người đăng ký1(hình dạng);
       Người đăng ký2 sub2 = mới Người đăng ký2(hình dạng);
       shape. Vẽ();
 
       // Giữ cửa sổ bảng điều khiển mở ở chế độ gỡ lỗi.
       Hệ thống.Console.WriteLine( "Nhấn phím bất kỳ để thoát." );
       System.Console.ReadKey();
     }
   }
 
}

Đầu ra:

?
1
2
3
Sub1 nhận sự kiện IDrawingObject.
Vẽ một hình dạng.
Sub2 nhận được sự kiện IShape.

Cuối cùng, bài viết này về việc kết hợp khung .net để kích hoạt các sự kiện lớp cơ sở và triển khai các sự kiện giao diện trong các lớp dẫn xuất C# sẽ kết thúc tại đây. Nếu bạn muốn biết thêm về cách kết hợp khung .net để kích hoạt các sự kiện lớp cơ sở và triển khai các sự kiện giao diện trong các lớp dẫn xuất C#. class, Để biết thông tin về việc triển khai các sự kiện giao diện, vui lòng tìm kiếm các bài viết của CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .

29 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress