tôi đã loại sau đây:C# - đúc lớp tổng quát để cơ sở không chung lớp của nó
public abstract class CustomerBase
{
public long CustomerNumber { get; set; }
public string Name { get; set; }
}
public abstract class CustomerWithChildern<T> : CustomerBase
where T: CustomerBase
{
public IList<T> Childern { get; private set; }
public CustomerWithChildern()
{
Childern = new List<T>();
}
}
public class SalesOffice : CustomerWithChildern<NationalNegotiation>
{
}
Các SalesOffice chỉ là một trong số ít các lớp đại diện cho mức độ khác nhau của hệ thống phân cấp của khách hàng. Bây giờ tôi cần phải đi qua hệ thống phân cấp này từ một số điểm (CustomerBase). Tôi không thể tìm ra cách thực hiện mà không sử dụng sự phản chiếu. Tôi muốn triển khai một cái gì đó như:
public void WalkHierarchy(CustomerBase start)
{
Print(start.CustomerNumber);
if (start is CustomerWithChildern<>)
{
foreach(ch in start.Childern)
{
WalkHierarchy(ch);
}
}
}
Có cơ hội nào tôi có thể làm việc như thế này không?
Các giải pháp dựa trên gợi ý có-childern giao diện tôi thực hiện:
public interface ICustomerWithChildern
{
IEnumerable ChildernEnum { get; }
}
public abstract class CustomerWithChildern<T> : CustomerBase, ICustomerWithChildern
where T: CustomerBase
{
public IEnumerable ChildernEnum { get { return Childern; } }
public IList<T> Childern { get; private set; }
public CustomerWithChildern()
{
Childern = new List<T>();
}
}
public void WalkHierarchy(CustomerBase start)
{
var x = start.CustomerNumber;
var c = start as ICustomerWithChildern;
if (c != null)
{
foreach(var ch in c.ChildernEnum)
{
WalkHierarchy((CustomerBase)ch);
}
}
}
Đây là giải pháp tốt nhất vì nó đóng gói thực hiện đi bộ và chỉ làm những điều đúng đắn mà không buộc người gọi phải nhận thức được các chi tiết thực hiện. – recursive
Lời khen ngợi cao từ một người có tên, "đệ quy". ;-) –
Dự án .NET lớn cuối cùng của tôi có yêu cầu tương tự, và cách của John Saunders giống như tôi đã làm. Làm nhiều thứ dễ dàng hơn nhiều :) – OregonGhost