0
public enum RelationType { Subclass, HasArm, HasLeg };
public RelationType RelationShipType { get; set; }

public static IOwlRelation AddSubClassRelation(IOwlClass parent, IOwlClass child)
{
    return new OwlRelation
    {
        Parent = parent,
        Child = child,
        RelationShipType = RelationType.Subclass
    };
}

これがOwlRelationクラスにあり、コンシューマークラスで最初に次のように言ってOwlRelationオブジェクトを作成したとします。

OwlRelation r1 = OwlRelation.AddSubClassRelation( someParent, someChild);

また、そのr1オブジェクトを 渡すことができるAddRelation(OwlRelation)のようなメソッドがあります。このメソッドの本体で、このオブジェクトの列挙の値と、その値に基づくいくつかのものを確認できます。

これが、OwlRelationクラスでその列挙型を定義した理由です。しかし、これはこれを達成するための正しい方法ではないと思います。おそらく、それを理解するのに十分な専門知識がありません。では、これを行う正しい方法は何だと思いますか?

4

3 に答える 3

4

さまざまな関係タイプをさまざまなクラスとして実装できます。

public abstract class OwlRelation : IOwlRelation
{
    // Implement infrastructure common to all relation types
}

public SubclassOwlRelation : OwlRelation
{
    // Implement things specific to Subclass-relations
}

public HasArmOwlRelation : OwlRelation
{
    // Implement things specific to HasArm-relations
}

...

実装では、このようなコードに遭遇する可能性があります

switch (relation.RelationshipType) {
    case RelationshipType.Subclass:
        DoSomeSubclassStuff(relation);
        break;
    case RelationshipType.HasArm:
        DoSomeArmStuff(relation);
        break;
    case RelationshipType.HasLeg:
        DoSomeLegStuff(relation);
        break;
}

オブジェクト指向のアプローチでは、対応するコードは次のようになります

relation.DoSomeStuff();
于 2012-08-07T17:54:59.113 に答える
1

あなたが何をしようとしているのかわかりません。他の方向から、を使用する2つの正しい方法は次のenumとおりです。

  1. 相互に排他的な値のセットがあり、その総数は、基になっている整数型よりも少なくenumintデフォルトでlongあり、可能な限り最大です)、それらすべてを合理的にリストできます(または期待できます)。ユーザーは、いくつかの外部標準のために、不足しているアイテムに対応する番号を知っています)。

  2. 相互に排他的ではない値のセットがあります。これを二項演算子と組み合わせると、たとえばRead1WriteExecute1、2、4の場合、読み取りと実行はできますが、書き込みはできません(1 | 4)。

さて、私は長い間Webオントロジー言語(それはあなたが意味する種類のOWLだと思います)を見ていませんが、Armとサブクラスがこれにどのように適合するかはわかりません(また、何も覚えていません) OWLの武器)。しかし、それが他のものにどのように適合するかもわかりません。「それは腕なのか、それともサブクラスなのか」という質問もわかりません。意味があります(列挙型の使用1に適合します)、または「それはアーム、サブクラス、またはその両方ですか、それともどちらでもないか」という質問でもありません。理にかなっています(列挙型に適合します-2を使用してください)。

ですから、答えはそれほど多くありませんが、うまくいけばenum、少しでも役立つように使用できます。

于 2012-08-07T17:54:12.497 に答える
1

これは典型的な問題だと思いますが、戦略パターンを適用することで解決します。したがって、@Olivierが提案したようにそれは異なるRelationStrategyサブクラスになります。 あなたはそれについてここで読むことができます

于 2012-08-07T18:09:12.450 に答える