Tôi muốn thêm giao diện vào một số loại được cài sẵn. Tôi có một giao diện, IConcludable
, mà tôi đang sử dụng như một ràng buộc cho Conclusion<T>
. Tôi không có đầu mối làm thế nào để tiếp cận điều này, hoặc nếu nó thậm chí có thể.Có cách nào để mở rộng kiểu tích hợp để kế thừa giao diện không?
Basic Layout
public interface IConcludable { }
public struct Conclusion<T> where T : IConcludable
{
public bool IsSuccessful;
public T Result;
// Constructors, members, etc.
}
public class ErrorReport : IConcludable { ... }
public class MathArg : IConcludable { ... }
public class ParseResult : IConcludable { ... }
Thực hiện
public Conclusion<ParseResult> ParseInput (string input)
{
// Parse input...
// Initialize ParseResult object...
return new Conclusion<ParseResult>(result);
}
Vấn đề
Khi tôi nhận được giá trị cuối cùng, đó là một built-in loại như int
, double
, string
, bool
, vv Tôi muốn sử dụng Conclusion<T>
như quay trở lại bởi vì tôi có một lớp học để xử lý các báo cáo lỗi khi chuỗi đầu vào là không hợp lệ:
if (conclusion.ReturnObject is ErrorReport)
{
ErrorManager errorManager = new ErrorManager();
errorManager.Resolve(conclusion);
}
Nghiên cứu
Tôi nhìn vào Các ràng buộc .
Dường như những hạn chế chỉ gắn với nhau, vì vậy kể cả các giao diện của mỗi built-in loại mà tôi cần đòi hỏi phải xác định một núi các phương pháp mà không có bất cứ điều gì để làm với tôi Conclusion
struct.
phương pháp mở rộng
Những thực sự thay đổi hành vi của các loại built-in. Nó không phải là những gì tôi đang tìm kiếm vì giao diện của tôi, IConcludable
, không có bất kỳ phương pháp nào.
Thay built-in loại
Không thể. Tôi không cần phải thay đổi hành vi của các loại này. Tôi chỉ muốn thêm một giao diện trống vào nó.
Dường như không có bất kỳ điều gì liên quan đến việc thêm giao diện vào loại được cài sẵn. Tôi không chắc chắn nếu "Thừa kế" là những gì nó sẽ được đề cập đến. Điều này có thể không?
Sửa
Better giải thích về Kết luận struct
Tôi đang sử dụng các cấu trúc kết luận như một đối tượng trở lại trong hầu hết các phương pháp của tôi. Điều này là do tôi đang sử dụng các đại biểu. Xem mã thực tế của các đối tượng bên dưới:
public delegate Conclusion<T> Validator<T>(T subclass) where T : IVerifiable<T>;
public delegate Conclusion<BaseFunction> Executor(BaseFunction subclass);
public struct Conclusion<T> where T : IConcludable
{
public bool IsSuccessful;
public T ReturnObject;
public Conclusion(T returnObject)
{
this.ReturnObject = returnObject;
this.IsSuccessful = returnObject is Error ? false : true;
}
}
public class BaseFunction : IVerifiable<BaseFunction>, IConcludable
{
public List<BaseArgument> Args;
public Executor Executing;
public Validator<BaseFunction> Validating;
public string UserInput;
public Conclusion<BaseFunction> Validate(BaseFunction subclass)
{
if (this.Validating != null)
{
return Validating(subclass);
}
else
{
StringBuilder message = new StringBuilder();
message.Append("A Validating delegate has not been assigned.");
throw new InvalidOperationException(message.ToString());
}
}
public Conclusion<BaseFunction> Execute(BaseFunction subclass)
{
if (this.Executing != null)
{
return this.Executing(subclass);
}
else
{
StringBuilder message = new StringBuilder();
message.Append("An Executing delegate has not been assigned.");
throw new InvalidOperationException(message.ToString());
}
}
}
public class Function<T> : BaseFunction
{
public T Result;
public Function()
{
base.Args = new List<BaseArgument>();
}
}
public class BaseArgument : IVerifiable<BaseArgument>, IConcludable
{
public string Role;
public string UserInput;
public int Position;
public Validator<BaseArgument> Validating;
public Conclusion<BaseArgument> Validate(BaseArgument subclass)
{
if (this.Validating != null)
{
return Validating(subclass);
}
else
throw new InvalidOperationException();
}
}
public class Argument<T> : BaseArgument
{
public T Value;
public Argument(int position)
{
base.Position = position;
}
}
public static class ExecutionHandler
{
public static Conclusion<BaseFunction> Sum(BaseFunction subclass)
{
subclass = (Function<double>)subclass;
// Execution code.
return new Conclusion<BaseFunction>(subclass);
}
public static Conclusion<BaseFunction> Concatenate(BaseFunction subclass)
{
subclass = (Function<double>)subclass;
// Execution code.
return new Conclusion<BaseFunction>(subclass);
}
}
Nếu tôi cần đăng nhiều hơn, tôi sẽ làm như vậy. nhưng nó thực sự rất nhiều để xem xét. Kiểu trả về của các phương thức được gán bởi tất cả các đại biểu mà tôi sử dụng có kiểu trả về là Conclusion<T>
để tôi có thể có một đối tượng trả về cũng như một lỗi nếu xảy ra. Các hàm trong mã ở trên trả về Conclusion<BaseFunction>
, nhưng trở lại đó được chuyển đổi thành một đối tượng Addend<T>
nếu nó là một số. Nếu nó là một phần của một loại hàm khác trả về một số string
hoặc bool
hoặc loại khác, nó sẽ được chuyển đổi thành một loại lớp khác. Khi kết thúc tính toán bằng số, lợi nhuận sẽ là một cái gì đó như Conclusion<int>
hoặc Conclusion<double>
. Vì vậy, hãy thêm int
và double
vào giao diện IConcludable
là những gì tôi đang cố gắng thực hiện. giải thích
Better của ứng dụng
Tôi viết một giao diện điều khiển ứng dụng C#. Nó lấy đầu vào từ người dùng và viết một câu trả lời. Dữ liệu nhập tương tự như công thức Excel: Sum(5, 15, Average(2, 3), 5)
hoặc Concatenate("5 + 5 = ", Text(Sum(5, 5)))
. Chuỗi đầu vào được xác thực, phân tích cú pháp và trả về kết quả.
như tôi thấy trong triển khai của bạn, bạn đang trả lại Kết luận. Nhưng bạn cũng nói *** Khi tôi nhận được giá trị cuối cùng, nó là một kiểu tích hợp như int, double, string, bool, etc ***, tôi không hiểu phần này. –
Mặc dù câu hỏi của bạn được đặt rất tốt, tôi nghĩ bạn nên làm sắc nét * câu hỏi thực tế * bạn có, vì hiện tại nó không rõ ràng những gì không làm việc với cấu trúc này. –
Không phải là kịch bản cho ** Mẫu bộ điều hợp **? –