设计/模式 - 我应该使用接口还是抽象类?

时间:2015-06-27 15:07:39

标签: c# wpf inheritance design-patterns interface

我有以下问题: 我正在创建一个用于创建UML图的应用程序。现在只是为了简化一切,我假设只有几个可用的图表元素:

  1. 接口
  2. 概括
  3. 界面实施
  4. 协会
  5. 聚合
  6. 我决定为所有元素创建一个公共抽象类:

    抽象的DiagramElement有2个子类,也是抽象的:

    1. DiagramRelation
    2. DiagramObject
    3. 接下来,DiagramRelation有4个子类:

      1. 概括
      2. InterfaceImplementation
      3. Assosication
      4. 聚合
      5. DiagramObject有2个子类:

        1. 接口
        2. 我真想发布一张图片,这样会更加简单,但我没有足够的声望点,对不起。

          我遇到了以下问题:每个元素都有不同的可视化表示,即:界面只有方法等,所以每个元素都需要以不同的方式显示 - 我不想使用多个&# 34;如果"说明。

          我使用WPF并且我决定将每个控件放到StackPanel中,它将放在MyContextControl中(在ContextControl之后继承并添加接口属性):

          public interface IDiagramElementDraw
          {
              public StackPanel Draw();
          }
          
          public MyContextControl : ContextControl
          {
              private IDiagramElementDraw _drawingInterface;
              private StackPanel context;
              public DrawControl()
              {
                  context = _drawingInterface.Draw();
              }
          } 
          

          但是我不知道哪个类应该实现IDiagramElementDraw接口 - 我不想在Interface,Class,Generalization等级上实现它,因为我希望它们只表示每个类的逻辑信息元件。

          我会感激任何帮助,随时发布完全不同的解决方案 - 这可能是完全错误的,这只是我的想法。

3 个答案:

答案 0 :(得分:0)

my answeranother question

  

使用接口或抽象类作为区别   基础:一个抽象类,一个共享实现;界面是一个   共享合同。他们有一些共性,但遇到不同   要求。例如,您可能想要共享需求(a   小武器和重武器之间的共同界面IProjectile,   或者在致命武器和非致命武器之间实施三者   三个不同抽象类的类别(LethalSmallArms,   所有实现共同的NonLethalSmallArms和Howitzers)   接口IProjectile。

来自another answer of mine

  

一个抽象类可以小心地扩展为非破坏性的   方式;对界面的所有更改都会发生变化。

     

更新:相反,接口可以是in或out类型参数   而抽象类则不能。有时一个或另一个更多   适合于给定的设计,有时它是一个折腾。

答案 1 :(得分:0)

一般来说,接口和抽象类都很有用;它只取决于世界卫生组织:

  • 对于那些使用您的API的人来说,接口是更理想的 保证他绝对自由。
  • 抽象类更多 有人希望扩展您的API,因为它们可以简化任务 延伸。

更敏感的选择是将两者结合起来:设计公共接口的层次结构(用于使用),并提供抽象类,其中的成员通常用于任何实现(用于扩展),如果您想让客户端扩展你的API,公开它们。

并且,在所有层次结构的底部,预期私有实现类。

答案 2 :(得分:0)

使用多态可能是一个很好的解决方案,并且会阻止"如果"条件。 1.你可以有一个IDrawable接口,它上面有一个Draw方法。 此接口将由您抽象类实现。 2.然后你将有一个ElementDrawing及其派生类,它将绘制不同的类型(类,接口,...)。它可能是一个虚拟属性,将根据类型在每个DiagramElement中进行不同的实例化。

    class abstract DiagramElement : IDrawable
    {
        public abstract void Draw();   
    }


    class ClassDiagramElement:DiagramElement 
    {
        public overrides void Draw()
        {
           ElementDrawing elementDrawing = new ClassDrawing();
           elementDrawing.DrawElement(); 
        }
    }

    class InterfaceDiagramElement:DiagramElement 
    {
        public overrides void Draw()
        {        
           ElementDrawing elementDrawing = new InterfaceDrawing();
           elementDrawing.DrawElement([maybe need some parameters]); 
        }
    }

ElementDrawing是绘制UML中不同元素的所有派生类的基类。它可以定义为如上所述的虚拟属性。