序列图中的抽象/具体类分离

时间:2014-12-27 09:32:37

标签: uml class-diagram sequence-diagram

有没有办法在序列图中分离抽象类及其具体分支?

我的用例是某些事务必须命中抽象类中实现的方法,而某些事务必须来自其具体实现。

或者它是类图而不是序列图的关注点?

2 个答案:

答案 0 :(得分:5)

在序列图中,您应该只使用您认识它们的类型的对象来执行该特定点。

然后在该对象上调用该方法,即使它是在抽象父类上实现的方法。

序列图与代码方面非常相似。

假设您有以下情况: Class diagram

然后在 ConcreteSubClass 的对象上调用已实现的抽象操作,因为您的用户类与 ConcreteSubClass 有关联,无论操作在何处实现

Sequence diagram

如果用户类与 AbstractClass 有关联,那么您可以对 AbstractClass

类型的对象调用操作

答案 1 :(得分:0)

如果你想建模两个不同的类,那么在序列图中它将意味着两个不同的生命线。这就是全部(据我所知)。

您可以在生命线头部显示任意<<stereotype>>(包括<<abstract>>),如下例所示:uml-diagrams.org: UML Sequence Diagrams Examples → Submit Comments to Pluck

例如,假设我们有这个(无用的)C#代码:

abstract class BaseClass
{
    protected abstract string Name { get; }

    public virtual void DoSomething()
    {
        Console.WriteLine("Something useful done.");
    }

    protected void SayHello(string to)
    {
        Console.WriteLine("Hi {0}, I'm {1}", to, this.Name);
    }
}

class Case1 : BaseClass
{
    protected override string Name { get { return "Case 1"; } }

    public override void DoSomething()
    {
        base.DoSomething();
    }
}

class Case2 : BaseClass
{
    protected override string Name { get { return "Case 2"; } }

    public void DoSomething(string to)
    {
        this.SayHello(to);
        base.DoSomething();
    }
}

class Program
{
    static void Main(string[] args)
    {
        var c1 = new Case1();
        var c2 = new Case2();
        c1.DoSomething();
        c2.DoSomething("Jane");
    }
}

然后UML序列图捕获Program.Main发生的事情可能如下所示:

enter image description here

我将抽象类绘制为隐式友元对象,使用具体类实例共享生命周期(和大部分内存)。实际上,如何在某些语言中实现类继承,因此该方案不是完全“组成”的。

但是,详细程度可能过于集中于实现,没有任何有用的抽象空间。即使是小代码重新分解,该图也无法存活