I am not sure if I do use the association and aggregation or composition diamond properly.
I would use the Association for interfaces, because I can\'t instantiate
Let's set the terms. The Aggregation is a metaterm in the UML standard, and means BOTH composition and shared aggregation, simply named shared. Too often it is named incorrectly "aggregation". It is BAD, for composition is an aggregation, too. As I understand, you mean "shared".
Further from UML standard:
composite - Indicates that the property is aggregated compositely, i.e., the composite object has responsibility for the existence and storage of the composed objects (parts).
So, University to cathedras association is a composition, because cathedra doesn't exist out of University (IMHO)
Precise semantics of shared aggregation varies by application area and modeler.
I.e., all other associations can be drawn as shared aggregations, if you are only following to some principles of yours or of somebody else. Also look here.
I would use the Association for interfaces, because I can't instantiate them. Like they do it here for example. Or for static classes, same reason.
And the diamonds I use only for objects I can instantiate. Like normal classes.
That's not really how they work. The three forms (Association, Aggregation and Composition) define different properties about a relationship. All three are normally used between classes although can relate Interfaces too. Association and Composition are the two easiest:
Aggregation (unfilled diamond) sits somewhere in the middle. It's a bit like composition - except it doesn't mandate the properties described above. I don't personally use it. The semantics are too unclear for it to be worthwhile.
And there is a third manner, the dashed lined <> arrow, but I don't have a glue when to use this one.
I think you mean the dependency relationship. It's a weaker form of association. As an example, take the following class definition
class Foo {
def bar(Baz: aParam) {
...
}
}
In this case type Foo has a dependency on type Baz from its use in the bar() method signature. However there's no association between them (can't sensibly discuss e.g. cardinality of relationship between an instance of Foo and an instance of Baz).
From a practical perspective I'd say:
hth.