2012-04-22 183 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; 
     } 
    } 

現在,如果我創建了一個類Concrete2Base繼承,以及和我想的GeoLocation對象有1個以上屬性:

public string Address{ get; set; } 

什麼是最好的實施方式?

我可以創建一個名爲GeoLocationEx : GeoLocation新類,並存在,但然後將Address財產在我Concrete2對象,我將有2個屬性:GeoLocationGeoLocationEx我不喜歡......

我也可以使Geolocation類部分,並將其與Address屬性爲Concrete2類延伸,但我不知道這會是一個「正確」使用部分類。

什麼能做到這一點的最好方法是什麼?

在此先感謝您的幫助!

+0

'GeoLocation'對象?在這種情況下,如果您想通過'Base'界面使用Concrete2'對象,則必須檢查它是否是Concrete2'對象,而不是'Concrete',並且只有傳入'GeoLocationEx'對象。 – 2012-04-22 14:29:28

+0

爲什麼不能簡單地將「地址」添加到GeoLocation對象? – 2012-04-22 14:30:39

+0

我找到了解決辦法看這個帖子: 抽象類請求其中T:參數{ -t參數; } 類專門:請求 { } – 2012-04-22 14:47:37

回答

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不共享相同的基類。 – 2012-04-22 14:38:13

+0

我去了通用的解決方案...謝謝! – 2012-04-22 14:54:04

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