2016-09-02 3 views
1

Вот что похоже на классы, с которыми я сейчас работаю.Выполнение oprator независимо от факта использования базового или унаследованного класса?

public class SomeClass 
{ 

    public PropertyAClass A { get; set;} 
    public PropertyBClass B { get; set;} 

    public SomeClass (PropertyAClass A, PropertyBClass B) 
    { 
     this.A = A; 
     this.B = B; 
    } 

    public static SomeClass operator +(SomeClass a, SomeClass b) 
    { 
     return new SomeClass(a.A + b.A, a.b + b.B); 
    } 
} 

public class DerivedClass : SomeClass 
{ 
    public DerivedClass (PropertyADerivedClass A, PropertyBDerivedClass B) : base(A,B) 
    { 
    } 

    //Operation is the same but I have to repeat the method 
    public static DerivedClass operator +(DerivedClass a, DerivedClass b) 
    { 
     return new DerivedClass(a.A + b.A, a.b + b.B); 
    } 
} 

Есть ли какой-нибудь умный способ, который позволил бы не повторить оператор + в производном классе, применяя его к базовому классу и по-прежнему получать производный класс в качестве вывода?

+2

Вы пытаетесь выяснить, как заменить одна очень простая строка кода. Даже если бы вы могли, все, что вы попытаетесь сделать, несомненно, будет значительно более сложным. – Servy

+0

Это пример. В фактическом коде строка кода может быть менее простой. – TTT

+0

Если это не репрезентативно, то решение этой проблемы вряд ли поможет вам. Как вы могли бы избежать повторения того, что работа над подробным творчеством будет сильно зависеть от того, что это за творение. – Servy

ответ

0

У меня сейчас нет компилятора C#, но я попытался написать что-то наизусть. Попробуйте использовать Generic тип Param, что-то вроде этого:

using System; 
using System.Reflection; 

public class SomeClass<T> 
{ 

    public PropertyAClass A { get; set;} 
    public PropertyBClass B { get; set;} 

    public SomeClass (PropertyAClass A, PropertyBClass B) 
    { 
     this.A = A; 
     this.B = B; 
    } 

    public static T operator +(T a, T b) 
    { 
     return new T(a.A + b.A, a.b + b.B); 
    } 
} 

public class DerivedClass : SomeClass<DerivedClass> 
{ 
    public DerivedClass (PropertyADerivedClass A, PropertyBDerivedClass B) : base(A,B) 
    { 
    } 
} 

Может быть, это поможет:

Pass An Instantiated System.Type as a Type Parameter for a Generic Class

http://www.dotnetperls.com/generic

https://msdn.microsoft.com/en-us/library/ms379564(v=vs.80).aspx

+0

Я думаю, что я уже пробовал это, но по какой-то причине Я отбрасываю его. Я могу попробовать еще раз. – TTT

+0

Ницца, удачи. http://stackoverflow.com/questions/1420581/inheritance-on-a-constrained-generic-type-parameter – Vitorlui

+1

Этот код не будет компилироваться ... C# generics очень ограничены и не позволят вам что-то сделать как это. Во-первых, компилятор не знает, что 'T' как член' A' и 'B' и даже меньше их типов. Например, код, очевидно, не будет работать с 'SomeClass '. – Phil1970

Смежные вопросы