架构:
create table TableA (A1 int)
create table TableB (B1 int, B2 int)
create table TableC (C1 int)
Run Code Online (Sandbox Code Playgroud)
有问题的查询:
SELECT *
FROM TableA a
INNER JOIN TableB b ON b.B1=a.A1
INNER JOIN (SELECT TOP 1 *
FROM TableC c
WHERE c.C1=b.B1 ORDER BY c.C1) d ON d.C2=b.B2
INNER JOIN OtherTable ON OtherTable.Foo=d.C1
Run Code Online (Sandbox Code Playgroud)
构建此模式并在SQL Server 2008下的SQLFiddle中运行查询会导致:
The multi-part identifier "b.B1" could not be bound.: SELECT * FROM TableA a INNER JOIN TableB b ON b.B1=a.A1 INNER JOIN (SELECT TOP 1 * …Run Code Online (Sandbox Code Playgroud) 说我有A级
class A
{
Z source;
}
Run Code Online (Sandbox Code Playgroud)
现在,上下文告诉我'Z'可以是不同类的实例(比如B和C),它们不在它们的继承树中共享任何公共类.
我想天真的方法是使"Z"的接口类,使B级和C实现它.
但是有些事情仍然没有说服我,因为每次使用A类实例时,我都需要知道'source'的类型.因此,所有完成的多个'ifs'制作'是instanceof'听起来不太好.也许在将来其他一些类实现Z,并且拥有这种类型的硬编码'ifs'肯定会破坏某些东西.
问题的存在是我无法通过向Z添加函数来解决问题,因为在每个实例类型的Z中完成的工作是不同的.
我希望有人可以给我和建议,也许是关于一些有用的设计模式.
谢谢
编辑:根据界面Z背后的类,当某个A的实例完全不同时,"某人"在某个地方所做的工作.这就是问题,执行"重要工作"的实体不是Z,是别人那个想知道谁是Z.
Edit2:也许一个具体的例子会有所帮助:
class Picture
{
Artist a;
}
interface Artist
{
}
class Human : Artist { }
class Robot : Artist {}
Run Code Online (Sandbox Code Playgroud)
现在某处我有一个实例Picture,
Picture p = getPicture();
// Now is the moment that depending if the type of `p.a` different jobs are done
// it doesn't matter any data or logic inside Human or Robot
Run Code Online (Sandbox Code Playgroud)