Скрыть метод .Add SortedList против использования другого имени метода с base.Add - PullRequest
0 голосов
/ 02 марта 2011

У меня есть собственный класс, который в основном представляет собой SortedList с несколькими дополнительными свойствами и методами.Я хотел бы выполнить дополнительную обработку при добавлении новой пары ключ / значение (т. Е. При вызове метода .Add).Я могу скрыть метод .Add или использовать другое имя метода (например: .AddPair), а затем вызвать base.Add в этом методе.Предпочитаемый подход?Зачем?

Скрыть. Добавить метод:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;    
namespace Inheritence_Test
{
    class Program
    {
        static void Main(string[] args)
        {
            DYseries d = new DYseries() { FieldName = "test" };
            d.Add(new DateTime(2010, 12, 1), 2345);
            d.Add(new DateTime(2010, 12, 5), 2340);
            d.Add(new DateTime(2010, 12, 2), 2343);
            Console.WriteLine("fieldName {0} \n count {1} \n max {2} \n min {3}", d.FieldName, d.Count(), d.Keys.Max(), d.Keys.Min());
        }
    }
    class DYseries : SortedList<DateTime, double>
    {
        public string FieldName { get; set; }
        new public void Add(DateTime date, double value)
        {
            base.Add(date,value);
            // additional processing here
            Console.WriteLine("Added date {0}.\n   Max date: {1}",date, this.Keys.Max());
        }

    }
}

или

, используя другое имя метода:

class Program
    {
        static void Main(string[] args)
        {
            DYseries d = new DYseries() { FieldName = "test" };
            d.AddPair(new DateTime(2010, 12, 1), 2345);
            d.AddPair(new DateTime(2010, 12, 5), 2340);
            d.AddPair(new DateTime(2010, 12, 2), 2343);
            d.AddPair(new DateTime(2010, 12, 9), 2348);
            Console.WriteLine("fieldName {0} \n count {1} \n max {2} \n min {3}", d.FieldName, d.Count(), d.Keys.Max(), d.Keys.Min());
        }
    }
    class DYseries : SortedList<DateTime, double>
    {
        public string FieldName { get; set; }
        public void AddPair(DateTime date, double value)
        {
            base.Add(date,value);
            // additional processing here
            Console.WriteLine("Added date {0}.\n   Max date: {1}",date, this.Keys.Max());
        }

    }

Есть ли предпочтительный подход?Будет ли один подход (скрытие?) Потенциально вызывать проблемы?

Ответы [ 2 ]

2 голосов
/ 02 марта 2011

Рассматривали ли вы использование агрегации, а не наследования здесь?

Пусть ваш класс DYSeries реализует IDictionary<>, ICollection<>, IEnumerable<>, IDictionary, ICollection, IEnumerable, как это делает SortedList. Затем создайте личный экземпляр SortedList, которому вы делегируете все реализации метода и свойства, добавив дополнительную обработку. Это обеспечит отсутствие риска непреднамеренного вызова нативного SortedList.Add и т. Д. Вызывающим абонентом.

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

2 голосов
/ 02 марта 2011

Используйте второй подход.Первый нарушает хороший дизайн ОО, и вы не будете уверены, будет ли вызван ваш метод или базовый класс.Рассмотрите это использование вашего класса:

SortedList<DateTime, double> myList = new DYseries();
myList.Add(date, value);  // This will call the base, not your implementation!

Я никогда не сталкивался с веской причиной для использования new;всегда есть другие способы достичь того, что вы хотите, не нарушая хорошего дизайна ОО.

...