2017-02-05 5 views
0

У меня есть два класса, которые близки к одному и тому же, за исключением одного типа переменной.
Следующий пример должен продемонстрировать проблему.Избегайте нескольких классов с несколькими различными свойствами

class Customer 
{ 
    byte Reputation; 
    const byte MaximumReputation = 255; 
    int Data; 
    string MoreData; 
    Briefcase EvenMoreData; 

    public Customer(byte reputation, int data, string moreData, Briefcase evenMoreData) 
    { 
     Reputation = reputation; 
     Data = data; 
     MoreData = moreData; 
     EvenMoreData = evenMoreData; 
    } 

    public float Level() 
    { 
     return Reputation/MaximumReputation; 
    } 

    public string Information() 
    { 
     return Data.ToString() + ", " + MoreData + EvenMoreData.Id; 
    } 
} 
class CustomerDeluxe 
{ 
    ushort Reputation; 
    const byte MaximumReputation = 255; 
    int Data; 
    string MoreData; 
    Briefcase EvenMoreData; 

    public CustomerDeluxe(ushort reputation, int data, string moreData, Briefcase evenMoreData) 
    { 
     Reputation = reputation; 
     Data = data; 
     MoreData = moreData; 
     EvenMoreData = evenMoreData; 
    } 

    public float Level() 
    { 
     return Reputation/MaximumReputation; 
    } 

    public string Information() 
    { 
     return Data.ToString() + ", " + MoreData + EvenMoreData.Id; 
    } 
} 

С Customer сек репутации не будет превышать 255, можно хранить в байте. В моем приложении это поле представляет собой большой массив. Вот почему я хотел бы выбрать самый маленький тип. Но для нескольких случаев, когда поле может превышать байт, должен быть еще один класс.

Как я могу «объединить» эти два класса?

ответ

2

Использование дженериков:

public class BaseCustomer<TRep> 
{ 
    protected TRep Reputation; 
} 

public class CustomerDeluxe : BaseCustomer<ushort> 
{ 
} 

public class Customer : BaseCustomer<byte> 
{ 
} 

С дженериков, вы в основном говорят: «Я не уверен, что тип TREP это, но это будет проявляться.» Общим считается open, когда он как указано выше в BaseCustomer<TRep>. Нам нужно будет закрыть, прежде чем мы сможем его использовать. Когда мы унаследовали его, тогда wev закрыть ed его с определенным типом: в одном экземпляре мы указали его как ushort, в другом мы указали его как byte.

И с некоторыми рефакторинга вы можете нажать большую часть кода в BaseCustomer<T>:

public abstract class BaseCustomer<TRep> 
{ 
    protected TRep Reputation; 
    protected const byte MaximumReputation = 255; 
    int Data; 
    string MoreData; 
    Briefcase EvenMoreData; 

    public BaseCustomer(TRep reputation, int data, string moreData, Briefcase evenMoreData) 
    { 
     Reputation = reputation; 
     Data = data; 
     MoreData = moreData; 
     EvenMoreData = evenMoreData; 
    } 

    public abstract float Level(); 


    public string Information() 
    { 
     return Data.ToString() + ", " + MoreData + EvenMoreData.Id; 
    } 
} 

public class CustomerDeluxe : BaseCustomer<ushort> 
{ 
    public CustomerDeluxe(ushort reputation, int data, string moreData, Briefcase evenMoreData) 
     : base(reputation, data, moreData, evenMoreData) 
    { 
    } 

    public override float Level() 
    { 
     return Reputation/MaximumReputation; 
    } 
} 

public class Customer : BaseCustomer<byte> 
{ 
    public Customer(byte reputation, int data, string moreData, Briefcase evenMoreData) 
     : base(reputation, data, moreData, evenMoreData) 
    { 
    } 

    public override float Level() 
    { 
     return Reputation/MaximumReputation; 
    } 
} 
+0

Спасибо за быстрый ответ, я не был осведомлен о дженериков. Не могли бы вы быть добрыми и расширить свой ответ с помощью синтаксиса общего массива, такого как byte [] vs ushort []? – Leander

+0

Я добавил несколько рефакторингов, чтобы действительно упростить и очистить вещи. Просто передайте тип в угловые скобки '' или '' – CodingYoshi

+0

Спасибо за ваше время. Я понял массив, у меня просто был умственный разрыв. – Leander

1
class CustomerDeluxe : CustomerBase 
{ 
    ushort Reputation; 

    public override ushort GetReputation() 
    { 
     return Reputation; 
    } 
} 

class Customer : CustomerBase 
{ 
    byte Reputation; 
    public override ushort GetReputation() 
    { 
     return Reputation; 
    } 
} 

abstract class CustomerBase 
{ 
    const byte MaximumReputation = 255; 
    public abstract ushort GetReputation(); 

    public float Level() 
    { 
     return GetReputation()/MaximumReputation; 
    } 
} 

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

  • Нет связанных вопросов^_^