2013-03-28 5 views
1

Есть ли способ сделать это:C# Продлить метод базового класса

class BetList : List<Bet> 
{ 
    public uint Sum { get; private set; } 
    void Add(Bet bet) : base.Add(bet) // <-- I mean this 
    { 
     Sum += bet.Amount; 
    } 
} 

Я хочу использовать базовый класс List, чтобы сделать операцию List. Я бы хотел реализовать Summming только.

ответ

0

Как насчет вычисления суммировать на лету, когда вам это нужно, а не хранить?

class BetList : List<Bet> 
{ 
    public uint Sum 
    { 
     get { return this.Count > 0 ? this.Sum(bet => bet.Amount) : 0; } 
    } 
} 
+0

Вам не нужна явная проверка пустой последовательности; ['Sum' вернет 0 в этом случае] (http://msdn.microsoft.com/en-gb/library/bb535184.aspx). – shambulator

+0

@shambulator Это правильно, но я сильный поклонник абсолютно безотказного кода, вне зависимости от того, что – Alex

+0

Я уточню: это * documented *, чтобы вернуть 0 в этом случае. Я не знаю, от чего отказывается ваш чек. :) – shambulator

6

следует использовать состав, вместо вывода

class BetList 
{ 
    List<Bet> _internalList=new List<Bet>(); 
    //forward all your related operations to _internalList; 
} 
+3

Кроме того, вы можете реализовать 'IEnumerable ' или '' IList , если вы хотите использовать класс любой из этих способов, без подклассы '' List . –

+0

Вы имеете в виду «альтернативно»? Однако я даю вам преимущество, но :) – David

+3

Ну, «альтернативно» означало бы вместо вашего ответа. Я имею в виду «дополнительно», потому что он совместим с вашим ответом. –

0

Если вы хотите сохранить класс вывод вместо композиции, попробуйте следующее:

class BetList : List<Bet> 
{ 
    public uint Sum { get; private set; } 
    new void Add(Bet bet) 
    { 
     base.Add(bet); 
     Sum += bet.Amount; 
    } 
} 
+3

А потом кто-то передает 'BetList' метод, принимающий' List ' и о, смотри, что мы в черном руке! Существует _ (почти) _ ** никогда ** хорошая причина для этого, и это не одна из тех причин. –

+0

@BinaryWorrier, чтобы быть справедливым, это единственный ответ, который напрямую отвечает на реальный вопрос (хотя я не уверен, что политика в том, что делать, когда кто-то спрашивает, как делать то, что, вероятно, не должно делать). –

+0

@BinaryWorrier Можете ли вы объяснить проблему (более подробно) с помощью этого решения? Начиная с моего основного сообщения я заметил, что List <> имеет метод Sum, но кроме этого я до сих пор не понимаю, почему это решение проблематично. – labuwx

2

Если вам необходимо расширить существующий тип коллекции вы должны использовать Collection<T>, который предназначен для этой цели. Например:

public class BetList : Collection<Bet> 
{ 
    public uint Sum { get; private set; } 

    protected override void ClearItems() 
    { 
     Sum = 0; 
     base.ClearItems(); 
    } 

    protected override void InsertItem(int index, Bet item) 
    { 
     Sum += item.Amount; 
     base.InsertItem(index, item); 
    } 

    protected override void RemoveItem(int index) 
    { 
     Sum -= item.Amount; 
     base.RemoveItem(index); 
    } 

    protected override void SetItem(int index, Bet item) 
    { 
     Sum -= this[i].Amount; 
     Sum += item.Amount; 
     base.SetItem(index, item); 
    } 
} 

Хорошее объяснение различий между List<T> и Collection<T> можно найти здесь: What is the difference between List (of T) and Collection(of T)?

выше класс будет использоваться как это:

var list = new BetList(); 
list.Add(bet); // this will cause InsertItem to be called 
+0

+1: Не могу поверить, что я этого не знал! Спасибо Phil :) –

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