Mọi Người Ngày mới vui vẻ ạ!
Em có vấn đề như sau:
Em có tạo ra 1 class process để xử lí dữ liệu từ giao diện chuyển xuống. Trong class process em có viết phương thức kiểm tra có phải ngto không! Em muốn lợi dụng hàm ở trên để áp dụng cho bài tiếp (Tìm các số nguyên tố gần bằng n) mà khi em tạo vòng for i không phải là đối tượng nên em không chấm đến phương thức được!
<Ngoài dùng constructor mặc định và constructor tham số > và<em Đang muốn không truyền tham số ở kiểm tra nguyên tố>Thì phải Làm sao ạ!.. Tại em đang thử get-set!
(Hai biến sok và son mọi người đừng quan tâm ạ vì đó là của câu khác ạ!)
Đối tượng trong C# form xử lí trong class
Chưa hiểu lắm.
Nhưng bạn đã thử dùng this
chưa?
this.kiemtranguyento()
dạ chưa!! em quên cả this để em thử ạ
Không ổn anh ơi!! tại vì i là số nguyên mà nên không phai this duoc!
i.kiemtrasonguyento()
Dùng cách gọi static method thử:
Process.kiemtranguyento()
i la số nguyên, bạn muốn kiểm tra i thì phải truyền i vô hàm kiemtranguyento(i)
Bạn đâu thể dùng i.
được.
Đột nhiên mình hiểu ra ý bạn
Bạn muốn thử get set với class Process có đúng không
Vì mỗi lần kiểm tra i là mỗi số khác, nên trước khi kiểm tra phải gán lại một lần.
Process.number = i;
Process.kiemtranguyento();
Cách thiết kế này không hay, nhưng thôi kệ, thích thì cứ vọc thôi.
Process.number = i;
Nếu ở ngoài scope của class Process
thì ko gọi vậy đc đâu. Để dùng setter trong property phải là
Process.Number = i;
Bạn thớt cần phải xem thêm sách về clean code. Bạn đặt tên method/function và variable không đúng với convention.
Tên method khi đặt phải là KiemTraNguyenTo()
-> viết hoa ở mỗi chữ cái đầu của từ . Không được đặt kiemtranguyento()
. Các function khác như Tongsole()
và TongsoChan()
đều sai convention.
Tên variable không được đặt là int Tong
mà phải là int tong
dạ anh gì đó ơi!! vậy theo anh nên truyền tham số vào hay nên làm theo tthuần đối tượng
Process.number = i;
Process.kiemtranguyento();
vậy anh!! cho em xin chút kinh nghiệm!
Duplicated post moved by noname00
status thì nên truyền tham số vào luôn cho mạch lạc và tường minh
Nếu làm như vậy thì cần gì phải khai báo biến private phai ko anh!
chẳng khác nào gionh struct
Ý của bạn ban đầu là muốn tạo 1 class, trong đó thuộc tính của nó là số nguyên number
, và các phương thức của nó là kiemtranguyento()
, timnguyentoganbang()
,…
Ý nghĩa khi bạn tạo ra class này chính là để nó tự kiểm tra chính nó, xem chính nó có phải là số nguyên tố hay không, hoặc tìm các số nguyên tố gần bằng nó,…
Điều đó là tốt.
Tuy nhiên ở trong vòng lặp for
, bạn có biến int i
, đó là biến kiểu nguyên thủy chứ không phải biến thuộc class mà bạn tạo.
Nếu bạn muốn chuyển biến i
đó thành class mà bạn tạo thì ở mỗi lần lặp for
, bạn khởi tạo một đối tượng thuộc class mà bạn định nghĩa:
MyInteger temp = new MyInteger(i); // i sẽ được gán vào number
if(temp.kiemtranguyento()){
//...
}
Đối với trường hợp này, việc làm như vậy không hiệu quả.
Mỗi lần lặp phải tạo một đối tượng mới chỉ để kiểm tra nguyên tố, quá rắc rối.
Thay vào đó, bạn có thể tạo một class khác chuyên dùng để xử lý số nguyên, ví dụ như MyMath
Trong class MyMath
đó có hàm kiemtranguyento()
, khi cần kiểm tra xem i
có phải là số nguyên tố hay không, chỉ cần truyền giá trị của số đó vào:
if(MyMath.kiemtranguyento(i)){
//...
}
Như vầy vẫn gọi là hướng đối tượng.
Chứ không phải hướng đối tượng là không được truyền tham số.
Bạn là con người, là một đối tượng, bạn vẫn cần đưa vào input
(không khí, thức ăn, nước uống) và xuất ra output
(… )
hay!!
cảm ơn anh !!
!!! tại em thấy nó bình thường!! nghe ngta nói hướng đối tượng là phải lấy đối tượng làm trung tâm nên!! tự làm khó!
Cám ơn mội người em hiểu rồi!! cũng làm ok ạ à hi hi!!
Nếu muốn vẫn dùng như ý bạn:
int i = 123;
bool res = i.kiemtranguyento();
Thì: Extension Methods
using System.IO;
using System;
class Program
{
static void Main()
{
Console.WriteLine("Hello, World!");
Console.WriteLine(7.kiemtranguyento());
Console.WriteLine(9.kiemtranguyento());
}
}
// Phải là lớp tĩnh: 'static class'
public static class Ext{
// Chú ý đến tham số 'number' và từ khóa 'this'
public static bool kiemtranguyento(this int number){
if(number<2)
{
return false;
}
for(int i=2;i<number;i++)
{
if(number%i==0)
{
return false;
}
}
return true;
}
}
Rút ngắn quá trình viết làm giống như phương thức được “thêm” vào lớp đó. Thực chất khi biên dịch
thì nó sẽ chuyển:
7.kiemtranguyento();
// thành
Ext.kiemtranguyento(7);