Có thể chấp nhận khai báo các đối tượng cùng loại, trong chính chúng không?


8

Có thể chấp nhận khai báo các đối tượng mới (và trả lại chúng) từ trong cùng một đối tượng, như trong ví dụ dưới đây không?

Hoặc, tốt hơn là di chuyển nó đến một loại handlerlớp học?

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    //Gets a list of persons
    public List<Person> GetPersons()
    {
        List<Person> _listPersons = new List<Person>();

        Person _person = new Person();
        _person.Name = "FooFii"; 
        _person.Age = 50;
        _listPersons.Add(_person); 

        return _listPersons; 
    }
}

6
tùy thuộc vào ngôn ngữ, tôi khuyên bạn nên GetPersonstĩnh hoặc không phải là thành viên của Người. Hiện tại bạn cần PersongọiGetPersons
Caleth 17/05/2016

Chắc chắn, Lớp Java Object(gốc của hệ thống phân cấp lớp) rõ ràng bắt buộc một clone()phương thức nhằm cung cấp một bản sao của đối tượng.
TMN

Câu trả lời:


9

Nói chung, đúng vậy . Nói chung, hàm tạo của một lớp là nơi tất cả các thiết lập cần thiết cho lớp đó hoạt động. Thường thì một phần của thiết lập đó được trừu tượng hóa sang các khu vực khác của mã. Ví dụ, mẫu nhà máy di chuyển rất nhiều thiết lập ban đầu sang một lớp khác để thiết lập được tách biệt rõ ràng với logic.

Trong ví dụ cụ thể của bạn, nó không ổn . Có thể vì ví dụ của bạn được xây dựng nhưng bạn đang kết hợp dữ liệu và logic. Bạn đang tuyên bố một người trông như thế nào và đưa cho tôi phương pháp làm thế nào để có được những người cụ thể. Thật đáng để xem xét Nguyên tắc Trách nhiệm duy nhất . Trong ví dụ của bạn, tôi sẽ có một lớp đơn giản xác định kiểu dữ liệu của Person, một kho lưu trữ có được mọi người và lớp đưa mọi người ra khỏi kho lưu trữ và sau đó làm một cái gì đó với dữ liệu (ví dụ gửi email cho họ)


5

Vâng, trong điều kiện thích hợp.

Một ví dụ phổ biến là thành phần bộ lọc. Tại đây, bạn xây dựng bộ lọc mới bằng cách gọi một phương thức trên bộ lọc cũ hơn.

Ví dụ giả định:

class Filter {
    public function where(string field_name, object value) {
        filters = (clone)this->filters;
        filters.setitem(field_name, value);
        return Filter(filters);
    }
}

Điều này cho phép sử dụng như

query = Filter()
    .where("username", "nobody")
    .where("password", "should be salted and hashed")
;
user = User.get(filter);

Đây là phần nào cách mà bộ chọn jQuery hoạt động và cách các bộ truy vấn Django hoạt động.


3

Thay vì làm theo cách này, tôi sẽ cố gắng thực hiện một cái gì đó giống như một phiên bản đóng gói hơn của mẫu nhà máy. Có một đối tượng riêng biệt tạo ra danh sách thay thế. Xem Factory (lập trình hướng đối tượng) .

Về cơ bản, bạn đã thực hiện mô hình nhà máy khi bạn trả về một danh sách Person, nhưng thay vào đó bạn có thể muốn có hai lớp riêng biệt. Nếu bạn tách nhà máy khỏi sản phẩm , việc triển khai của Personbạn sẽ không được gắn với lớp tạo ra danh sách (nghĩa là PersonFactory).

Nếu bạn thấy liên kết ở trên, bạn sẽ thấy một ví dụ tương tự như của bạn thực sự được đăng dưới phần tên mô tả . Tuy nhiên, vì lý do trên tôi sẽ không làm theo cách này. Xem phần về Đóng gói (cũng trong liên kết).


1

Tôi có thể cho bạn một ví dụ và không sai khi trả về các đối tượng cùng loại trong cùng loại.

Xem xét điều này.

class Employee {}

class Manager : Employee 
{
    List<Employee> Employees { get; set;}
    Manager ReportsTo { get; set; }
}

Có một ranh giới mỏng giữa tách hoặc trộn các mối quan tâm. Nếu bạn thấy mình ở phía bên kia của dòng đó, bạn có thể sử dụng trình quản lý / xử lý / ... gõ một đối tượng.

class Organization 
{
    Employee FindEmployeeByName (string name) {}
    Employee FindManagerOf (Employee emp) {}
    List<Employees> TeamOf (Employee manager)
    ...
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.