2016-04-04 26 views
0

Tekrarlanan kod parçalarına sahibim. Bu DRY prensibi ile çelişir. Ama bunun yerini jenerik yöntemle nasıl değiştirdiğimi bilmiyorum.C# doğru yolu genel yöntem uygulayarak

class Foo 
{ 
    public bool isFirstAttribHasRightValue; 
    public bool isSecondAttribHasRightValue; 
    private readonly T1 _firstAttrib; 
    private readonly T2 _secondAttrib; 

    public HashSet<T1> relatedToFirstAttrib; 
    public HashSet<T2> relatedToSecondAttrib; 
    ... 

    public C() 
    { ... } 

    public T1 GetFirstAttrib(T3 somevalue) 
    { 
     return (somevalue != othervalue) || isFirstAttribHasRightValue ? _firstAttrib : default(T1); 
    } 

    public T2 GetSecondAttrib(T3 somevalue) 
    { 
     return (somevalue != othervalue) || isSecondAttribHasRightValue ? _secondAttrib : default(T2); 
    } 

    public ClearRelatedToFirst() 
    { 
     isFirstAttribHasRightValue = true; 
     relatedToFirstAttrib.Clear(); 
    } 

    public ClearRelatedToSecond() 
    { 
     isSecondAttribHasRightValue = true; 
     relatedToSecondAttrib.Clear(); 
    } 
    ... 
} 

Ben ClearRelatedToAttrib<TYPE>() için, ClearRelatedToFirst() ve ClearRelatedToSecond() gibi yinelenen yöntemleri değiştirmek ister. Ve bu cinayet yönteminin içinde hangi bool ayarlanacağını bilmiyorum, ya da hashset temizlemeye ihtiyacım var. Diğer yinelenen yöntemlerle aynı. Bana gösterebilir misin, bu kodu nasıl değiştirebilirim? Teşekkürler. Aşağıda

cevap

1

bakınız kodu: i istenen türüne göre nitelik döndürmek istiyorsanız

class Attribute<T> 
{ 
    public bool isRightValue; 
    public HashSet<T> relatedHashSet; 
    private T _value; 

    public T GetValue(T3 somevalue) 
    { 
     return (somevalue != othervalue) || isRightValue ? _value : default(T); 
    } 

    public Clear() 
    { 
     isRightValue = true; 
     relatedHashSet.Clear(); 
    } 
} 

class Foo 
{ 
    public Attribute<T1> firstAttribute; 
    public Attribute<T2> secondAttribute; 
    ... 

    public Foo() 
    { ... } 
    ... 
} 
+0

i yöntemini nasıl uygulamak gerekir? public Attribute GetAttribute (T) {// orada ne olmalı? } ' – gek0n