Tôi phải thiết kế một giải pháp cho một nhiệm vụ, và tôi muốn sử dụng một cái gì đó về mặt lý thuyết tương tự như ExpressionVisitor của C#.Động lực của việc triển khai C# ExpressionVisitor là gì?
Vì sự tò mò, tôi đã mở các nguồn .NET cho ExpressionVisitor
để xem xét. Từ thời điểm đó, tôi đã tự hỏi tại sao nhóm .NET thực hiện khách truy cập như họ đã làm.
Ví dụ MemberInitExpression.Accept
trông như thế này:
protected internal override Expression Accept(ExpressionVisitor visitor) {
return visitor.VisitMemberInit(this);
}
tôi - có lẽ Noob - Câu hỏi là: nó có ý nghĩa gì? Tôi có nghĩa là không nên chính phương pháp chấp nhận chịu trách nhiệm về cách nó thực hiện việc truy cập trong chính nó? Tôi có nghĩa là tôi đã mong đợi một cái gì đó như thế này (loại bỏ khả năng hiển thị internal
là Overridable từ bên ngoài):
protected override Expression Accept(ExpressionVisitor visitor) {
return this.Update(
visitor.VisitAndConvert(this.NewExpression, "VisitMemberInit"),
visitor.Visit(this.Bindings, VisitMemberBinding)
);
}
Tuy nhiên, mã này nằm ở cùng VisitMemberInit
phương pháp cơ sở ExpressionVisitor
's, mà được gọi là từ MemberInitExpression.Accept
. Vì vậy, có vẻ như không phải bất kỳ lợi ích nào của việc triển khai Accept
tại đây.
Tại sao không xử lý cây trong cơ sở ExpressionVisitor
và quên tất cả các phương pháp Accept
?
Tôi hy vọng bạn hiểu điểm của tôi và hy vọng ai đó có thể làm sáng tỏ một số động lực đằng sau triển khai này. Có lẽ tôi không hiểu mẫu khách truy cập ở tất cả? ...
Cảm ơn. Tôi hiểu điểm thực hiện. Dù sao thì tôi cũng đề cập đến đề xuất của tôi rằng phương thức Accept sẽ không ở bên trong, chỉ được bảo vệ ảo. Tôi sẽ sửa câu hỏi của tôi, xin lỗi vì đã gây hiểu nhầm. –
Điều đó không hữu ích bởi vì bạn có thể có nhiều khách truy cập làm những việc khác nhau. Bạn không thể mong đợi mã người dùng ghi đè phương thức này. – usr
Đối với chỉnh sửa của bạn, năng động, di chuyển được thực hiện ngay bây giờ trong phương thức ExpressionVisitor.Visit, trong một công tắc lớn tôi nghĩ (dựa trên NodeType), nhưng tôi phải kiểm tra. –