【发布时间】:2015-12-23 07:54:59
【问题描述】:
我想为一些内置类型添加一个接口。我有一个接口IConcludable,我将其用作Conclusion<T> 的约束。我不知道如何解决这个问题,或者是否有可能。
基本布局
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 { ... }
实施
public Conclusion<ParseResult> ParseInput (string input)
{
// Parse input...
// Initialize ParseResult object...
return new Conclusion<ParseResult>(result);
}
问题
当我得到最终值时,它是一个内置类型,如int、double、string、bool 等。我想使用Conclusion<T> 作为返回,因为我有当输入字符串无效时处理错误报告的类:
if (conclusion.ReturnObject is ErrorReport)
{
ErrorManager errorManager = new ErrorManager();
errorManager.Resolve(conclusion);
}
研究
我研究了约束。
似乎约束只会加在一起,因此包括我需要的每个内置类型的接口将需要定义大量与我的 Conclusion 结构无关的方法。
扩展方法
这些实际上改变了内置类型的行为。这不是我要找的,因为我的界面 IConcludable 没有任何方法。
替换内置类型
不可能。不过,我不需要更改这些类型的行为。我只想为其添加一个空接口。
似乎没有任何关于向内置类型添加接口的内容。我不确定是否会提到“继承”。这可能吗?
编辑
对结论结构的更好解释
我在大多数方法中都使用结论结构作为返回对象。这是因为我正在使用代表。请参阅下面的对象的实际代码:
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);
}
}
如果我需要发布更多内容,我会的。但它确实有很多值得一看的地方。我使用的所有委托分配的方法的返回类型都有一个返回类型Conclusion<T>,这样我就可以有一个返回对象以及一个错误如果发生。上面代码中的函数返回Conclusion<BaseFunction>,但是如果它是一个数字,则该返回被转换为一个对象Addend<T>。如果它是返回string 或bool 或其他类型的其他类型函数的一部分,则将其转换为不同类型的类。在数值计算结束时,返回类似于Conclusion<int> 或Conclusion<double>。所以将int和double添加到IConcludable接口就是我想做的。
更好地解释应用程序
我正在编写一个 C# 控制台应用程序。它接受用户的输入,并写下一个答案。输入类似于 Excel 公式:Sum(5, 15, Average(2, 3), 5) 或 Concatenate("5 + 5 = ", Text(Sum(5, 5)))。输入字符串经过验证、解析并返回结果。
【问题讨论】:
-
正如我在您的实现中看到的,您正在返回结论
。但是你也说我得到最终值的时候,是int、double、string、bool等内置类型,这部分我没看懂. -
虽然你的问题说得很好,但我认为你应该加强 actual question 你有,因为目前尚不清楚什么不适用于这个结构。
-
这不是适配器模式的场景吗?
-
@kienct89 :我将发布对问题的编辑以更好地解释它。谢谢。
-
@LeiYang :我不确定适配器模式是什么。我对编程还是有点陌生。这是一个 C# 控制台应用程序,它读取输入行,并对其进行解析以产生结果,并将其显示给用户。
标签: c# inheritance built-in