【发布时间】:2012-03-27 08:50:13
【问题描述】:
我有一个接口 IRenderable 和一个类,该类管理呈现实现该接口的类的所有实例。
我的代码中有很多类,并且希望其他人创建实现相同接口的类。
由于渲染的性质,我想说“在此类的实例之前绘制此类的实例”。
典型的方法是让每个类实现一个DrawOrder 属性,但我不喜欢这样,因为类没有明确的绘制顺序值,重要的是相对顺序。如果我给每个类一个DrawOrder 属性,任何实现该接口的人都需要知道所有类的值是什么。如果很多人可以实现自己的类,显然这是不可能的。
我希望能够定义“ClassA 在 ClassB 之前,ClassC 在 ClassA 之前”的规则,然后在计算绘制顺序/添加实例时,我可以推断出正确的绘制顺序。实现该接口的其他人可以添加他们自己的与内置实现相关的规则以及他们自己的添加。
编辑:我希望的是一些管理规则并管理维护秩序的类,如下所示:
class Renderer
{
private List<Rule> Rules;
private List<IRenderable> Renderables;
// Adds to list of rules
void EnforceBefore(Type FirstClass, Type SecondClass);
// Inserts items ensuring all rules are followed.
void Insert(IRenderable ClassInstance);
void RenderAll();
}
然后类可以添加适当的规则(或者我可以有一个返回它们的接口方法)。
下面是一个不起作用的快速测试
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main(string[] args)
{
List<string> MyList = new List<string> { "wherever", "second", "first", "third", "first", "third", "second" };
RuleBasedComparer<string> RuleComparer = new RuleBasedComparer<string>();
// I want to ensure all instances of "first" appear in the list before all instances of "second"
// and all instances of "second" appear in the list before all instances of "third".
// I don't care where "wherever" appears (or anything beyond the above rules)
RuleComparer.AddRule("first", "second");
RuleComparer.AddRule("second", "third");
MyList.Sort(RuleComparer);
foreach (var item in MyList)
Console.WriteLine(item);
Console.ReadKey();
}
}
public class RuleBasedComparer<T> : Comparer<T>
{
private class OrderRule
{
public readonly T Before;
public readonly T After;
public OrderRule(T before, T after)
{
Before = before;
After = after;
}
}
private List<OrderRule> _Rules = new List<OrderRule>();
public void AddRule(T before, T after)
{
_Rules.Add(new OrderRule(before, after));
}
public override int Compare(T x, T y)
{
// Find the applicable rule for this pair (if any)
var ApplicableRule = _Rules.Where(or => or.After.Equals(x) && or.Before.Equals(y) ||
or.After.Equals(y) && or.Before.Equals(x)).SingleOrDefault();
if (ApplicableRule != null)
{
// If there is a rule then if x should be before y then return -1, otherwise return 1
if (ApplicableRule.Before.Equals(x))
return -1;
else
return 1;
}
else
{
// If no rule exists then say they are equal
return 0;
}
}
}
TL;DR:我如何从“ClassA 在 ClassB 之前”之类的规则转变为实例/类的明确顺序。
因缺乏完整规则而产生的歧义无关紧要,我只希望遵守现有规则。
【问题讨论】: