首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >伪多重继承

伪多重继承
EN

Stack Overflow用户
提问于 2012-01-06 08:51:46
回答 5查看 209关注 0票数 4

我使用LINQ to SQL将一系列对象映射到数据库中。这些表是高度规范化的。我将把我的问题抽象出来。我在数据库中实现了五个中心实体。然后我有一系列其他的对象,我想要实现这五个实体中的一个或全部。

假设我正在实现一种体育场类(想想运动队)。这五个实体是五大运动:棒球、篮球、足球、曲棍球、足球。我想显式地为每个体育场实现一个类。

这是一个例子,洋基体育场举办过棒球、曲棍球和足球比赛。我想让它实现这3个接口中的每一个。StadiumBaseClass是我的抽象基类,它与数据库交互。StadiumBaseClass实现了所有5个主要的体育接口。我不希望在所有可能的体育场中都有相同的代码来实现IBaseball接口,我希望它在StadiumBaseClass中实现一次。

在这个例子中,我只想实现3,这是最好的方法吗?这有点单身,但不完全是吧?

代码语言:javascript
复制
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;} }
}  
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-01-06 09:03:44

以下是另一种方法(我们使用了类似的方法,但不确定它与linq实现的对应程度如何):

让StadiumBaseClass实现每个具有基本功能的接口,然后公开实现类可以使用的虚拟属性,以a)指示它支持哪些接口,b)根据需要更改默认行为。

例如,假设以下接口:

代码语言:javascript
复制
    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();
    }

你的基类应该看起来像这样:

代码语言:javascript
复制
    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
    }

这将使您的个人体育场类为:

代码语言:javascript
复制
    class YankeeStadium : StadiumBaseClass
    {
        public override bool  IBaseballImplemented
        {
            get 
            { 
                return true;
            }
        }
        public override bool IHockeyImplemented
        {
            get
            {
                return true;
            }
        }
        public override bool IFootballImplemented
        {
            get
            {
                return true;
            }
        }
    }
票数 0
EN

Stack Overflow用户

发布于 2012-01-06 09:21:05

我认为你根本不应该使用继承。应该有一个具有name属性的Stadium类,而不是YankeeStadium类。

同样,您应该具有诸如HasHockey之类的属性,或者如果不适用,则简单地让Hockey属性返回null。

票数 2
EN

Stack Overflow用户

发布于 2012-01-06 09:48:23

这似乎是一个常见的面向对象建模问题的变体-在过去,我曾将其视为对教育机构建模的问题,其中给定的人可能是学生、导师、讲师、标记、研究人员等中的一个或多个。

我见过的最好的解决方案是Peter CoadJeff De Luca提出的Nebulon Archetypal Domain Shape,也称为Color Modelling

在您的情况下,实际的体育场应该是您的Places。由于您希望显式地将每个体育场实现为一个类,因此每个类都代表实际的体育场。拥有一个通用的抽象基类可能会有所帮助。类的属性将描述体育场的物理属性-例如它的实际地址,等等。

您希望支持的每个不同的运动(您列出的是棒球、篮球、足球、曲棍球和足球)都将作为一个Role类实现,比如BaseballStadiumBasketballStadiumFootballStadiumHockeyStadiumSoccerStadium。类上的属性将描述与主办该特定运动相关的特定特征(例如,座位容量可能因运动而异)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8752063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档