c# - 如何强制其他人遵守子类的特定布局?

标签 c# oop reflection

我有一个抽象类如下:

public abstract class Node
{
    public abstract void run();
}

有些子节点可能具有多个属性作为输入和输出。但是所有的操作都是在每个节点应该实现的 run() 方法中完成的。例如,绘制一条线的节点可能是这样的:

public class LineNode : Node
{
    [Input]
    public Point a;
    [Input]
    public Point b;
    [Output]
    public Line line;
    public override void run()
    {
        line = new Line(a, b);
        // draw line ...
    }
}

[AttributeUsage(AttributeTargets.Field)]
public class Input : System.Attribute
{

}
[AttributeUsage(AttributeTargets.Field)]
public class Output : System.Attribute
{

}

如您所见,我没有关于子类中字段的任何先验信息。 ** 一个节点要成为约定中的有效节点,只需要至少有一个输出。** 我想强制所有其他用户在他们的节点中至少有一个输出所以我可以通过查找应用了 [Output] 属性的字段来通过反射找到它。
这可能吗?
如果是这样,这是最好的方法吗?

谢谢你的帮助


Here提出了同样的问题,但建议的解决方案在运行时解决了它。不过,我一直在寻找面向对象的解决方案。实际上哪一个更符合逻辑?

最佳答案

你可以这样做

public interface IRunnable<T>
{
    T Run();
}

然后每个实现此接口(interface)的类都必须提供此运行方法并返回(强类型)结果。

或者如果run方法没有返回结果

public interface IRunnable<T>
{
    void Run();
    T Value {get;}
}
public class LineNode : IRunnable<Line>
{
    [Input]
    public Point a;
    [Input]
    public Point b;

    private Line line;
    public Line Value { get{return line;}}
    public override void run()
    {
    line = new Line(a, b);
    // draw line ...
    }

关于c# - 如何强制其他人遵守子类的特定布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30712417/

相关文章:

c# - Controller 范围之外的 ControllerContext 和 ViewData - MVC3 C#

php - 在带有 OOP 的 PHP 中使用 Memcache

C# 有没有办法使类中对象的属性在类本身之外不可编辑?

c# - 以编程方式启用 Windows 功能的最佳方法是什么?

c# - 关闭/销毁 FtpWebRequest

python-3.x - PUBLIC属性和方法(作用于公共(public)属性)可以被视为封装吗?

scala - 有什么方法可以从 Scala (2.10) 类型标记或符号获取 Java 类吗?

java - 不使用反射访问类的字段?

java - 为什么Java Singleton需要防止反射攻击

c# - 正则表达式 - 只捕获旁边没有字母的数字