我使用LINQ to SQL将一系列对象映射到数据库中。这些表是高度规范化的。我将把我的问题抽象出来。我在数据库中实现了五个中心实体。然后我有一系列其他的对象,我想要实现这五个实体中的一个或全部。
假设我正在实现一种体育场类(想想运动队)。这五个实体是五大运动:棒球、篮球、足球、曲棍球、足球。我想显式地为每个体育场实现一个类。
这是一个例子,洋基体育场举办过棒球、曲棍球和足球比赛。我想让它实现这3个接口中的每一个。StadiumBaseClass是我的抽象基类,它与数据库交互。StadiumBaseClass实现了所有5个主要的体育接口。我不希望在所有可能的体育场中都有相同的代码来实现IBaseball接口,我希望它在StadiumBaseClass中实现一次。
在这个例子中,我只想实现3,这是最好的方法吗?这有点单身,但不完全是吧?
class YankeeStadium : IBaseball, IHockey, IFootball
{
StadiumBaseClass _Stadium {get; set;}
// IBaseball
public IBaseball.Whatever {get { return _Stadium.Baseball;} }
// IFootball
public IFootball.Whatever {get { return _Stadium.Hockey;} }
// IHockey
public IHockey.Whatever {get { return _Stadium.Hockey;} }
} 发布于 2012-01-06 09:03:44
以下是另一种方法(我们使用了类似的方法,但不确定它与linq实现的对应程度如何):
让StadiumBaseClass实现每个具有基本功能的接口,然后公开实现类可以使用的虚拟属性,以a)指示它支持哪些接口,b)根据需要更改默认行为。
例如,假设以下接口:
public interface IBaseball
{
void Whatever();
}
public interface IHockey
{
void Whatever();
}
public interface IFootball
{
void Whatever();
}
public interface IBasketball
{
void Whatever();
}
public interface ISoccer
{
void Whatever();
}你的基类应该看起来像这样:
public class StadiumBaseClass : IBaseball, IBasketball, IHockey, IFootball, ISoccer
{
#region IBaseball Members
public virtual bool IBaseballImplemented
{
get
{
return false;
}
}
void IBaseball.Whatever()
{
// Do something
}
#endregion
#region IBasketball Members
public virtual bool IBasketballImplemented
{
get
{
return false;
}
}
void IBasketball.Whatever()
{
// Do something
}
#endregion
#region IHockey Members
public virtual bool IHockeyImplemented
{
get
{
return false;
}
}
void IHockey.Whatever()
{
// Do something
}
#endregion
#region IFootball Members
public virtual bool IFootballImplemented
{
get
{
return false;
}
}
void IFootball.Whatever()
{
// Do something
}
#endregion
#region ISoccer Members
public virtual bool ISoccerImplemented
{
get
{
return false;
}
}
void ISoccer.Whatever()
{
// Do something
}
#endregion
}这将使您的个人体育场类为:
class YankeeStadium : StadiumBaseClass
{
public override bool IBaseballImplemented
{
get
{
return true;
}
}
public override bool IHockeyImplemented
{
get
{
return true;
}
}
public override bool IFootballImplemented
{
get
{
return true;
}
}
}发布于 2012-01-06 09:21:05
我认为你根本不应该使用继承。应该有一个具有name属性的Stadium类,而不是YankeeStadium类。
同样,您应该具有诸如HasHockey之类的属性,或者如果不适用,则简单地让Hockey属性返回null。
发布于 2012-01-06 09:48:23
这似乎是一个常见的面向对象建模问题的变体-在过去,我曾将其视为对教育机构建模的问题,其中给定的人可能是学生、导师、讲师、标记、研究人员等中的一个或多个。
我见过的最好的解决方案是Peter Coad和Jeff De Luca提出的Nebulon Archetypal Domain Shape,也称为Color Modelling。
在您的情况下,实际的体育场应该是您的Places。由于您希望显式地将每个体育场实现为一个类,因此每个类都代表实际的体育场。拥有一个通用的抽象基类可能会有所帮助。类的属性将描述体育场的物理属性-例如它的实际地址,等等。
您希望支持的每个不同的运动(您列出的是棒球、篮球、足球、曲棍球和足球)都将作为一个Role类实现,比如BaseballStadium、BasketballStadium、FootballStadium、HockeyStadium和SoccerStadium。类上的属性将描述与主办该特定运动相关的特定特征(例如,座位容量可能因运动而异)。
https://stackoverflow.com/questions/8752063
复制相似问题