2012-04-22 13 views
1

У меня есть следующий случай:C# абстрактный базовый класс - расширение реализации

public class GeoLocation 
    { 
     public double Longitude { get; set; } 
     public double Latitude { get; set; } 
     public string LocationName { get; set; } 
    } 

    public abstract class Base 
    { 
     public abstract GeoLocation GeoLocation { get; set; } 
    } 

    public class Concrete : Base 
    { 
     public override GeoLocation GeoLocation 
     { 
      get; 
      set; 
     } 
    } 

Теперь, если я создаю класс Concrete2, который наследуется от Base, а также и я хочу GeoLocation объект, чтобы иметь больше 1 свойство:

public string Address{ get; set; } 

Каков наилучший способ реализации этого?

я мог бы создать новый класс GeoLocationEx : GeoLocation и поместить Address недвижимость там, но тогда в моем объекте Concrete2, я бы 2 свойства: GeoLocation и GeoLocationEx, которые мне не нравятся ...

Я мог бы также сделать Класс GeoLocation неполный и расширить его с помощью свойства Address для класса Concrete2, но я не уверен, что это было бы «правильным» использованием частичных классов.

Что может быть лучшим способом для этого?

Заранее благодарим за вашу помощь!

+0

Почему вы хотите класс потомок работать с расширенной 'GeoLocation' объекта? В этом случае, если вы хотите работать с объектами Concrete2 через интерфейс «Base», вам нужно будет проверить, является ли это «Concrete2» объектом, а не «Concrete», и только затем передается в объект «GeoLocationEx». –

+0

Почему вы не можете просто добавить «Адрес» к объекту GeoLocation? –

+0

Я нашел решение, смотрящее на это сообщение: abstract class Request где T: Параметры { T Параметры; } класс Специализированный: Запрос { } –

ответ

1

Вы могли бы использовать дженерики:

public class GeoLocation 
     { 
      public double Longitude { get; set; } 
      public double Latitude { get; set; } 
      public string LocationName { get; set; } 
     } 

     public class GeoLocationEx : GeoLocation 
     { 
      public double Address { get; set; } 
     } 

     public abstract class Base<T> 
     { 
      public abstract T GeoLocation { get; set; } 
     } 

     public class Concrete : Base<GeoLocation> 
     { 
      public override GeoLocation GeoLocation 
      { 
       get; 
       set; 
      } 
     } 

     public class Concrete2 : Base<GeoLocationEx> 
     { 
      public override GeoLocationEx GeoLocation 
      { 
       get; 
       set; 
      } 
     } 
+1

Проблема с этим состоит в том, что бетон и Concrete2 не одни и те же базовый класс. –

+0

Я пошел на общее решение ... Спасибо! –

1
public class GeoLocation 
{ 
    public GeoLocation(GeoLocation obj) {/* implement a copy constructor */} 
    public GeoLocation() {/* default constructor */} 

    public double Longitude { get; set; } 
    public double Latitude { get; set; } 
    public string LocationName { get; set; } 
} 

public class GeoLocationEx : GeoLocation 
{ 
    public string Address { get; set; } 
} 

public abstract class Base 
{ 
    public abstract GeoLocation GeoLocation { get; set; } 
} 

public class Concrete2 : Base 
{ 
    private GeoLocationEx _geoLocation; 
    public override GeoLocation GeoLocation 
    { 
     get { return _geoLocation; } 
     set 
     { 
      _geoLocation = new GeoLocationEx(value); 
     } 
    } 
} 

Теперь внутри Concrete2 класса вы можете работать непосредственно с частным GeoLocationEx поля. Кроме того, вы можете открыть дополнительные общедоступные методы для Concrete2.

Обратитесь к MSDN по написанию конструкторы копирования: http://msdn.microsoft.com/en-us/library/ms173116(v=vs.80).aspx

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