2016-02-17 5 views
0

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

Базовый класс:

public class PromotionBase : IPromotionBase 
{ 
    private string CurrentPromotion = string.Empty; 
    public PromotionBase(string promotionName) 
    { 
     CurrentPromotion = promotionName; 
    } 
    public DateTime? StartDate => SettingsManager.GetSettingDateTime(CurrentPromotion, nameof(this.StartDate)); 
    public DateTime? EndDate => SettingsManager.GetSettingDateTime(CurrentPromotion, nameof(this.EndDate)); 
    public string PromoCode => SettingsManager.GetSettingString(CurrentPromotion, nameof(this.PromoCode)); 
    public DateTime? OrderQualificationStartDate => SettingsManager.GetSettingDateTime(CurrentPromotion, nameof(this.OrderQualificationStartDate)); 
    public DateTime? OrderQualificationEndDate => SettingsManager.GetSettingDateTime(CurrentPromotion, nameof(this.OrderQualificationEndDate)); 
    public int DiscountPercentage => SettingsManager.GetSettingInt(CurrentPromotion, nameof(this.DiscountPercentage)); 
    public int UsageLimit => SettingsManager.GetSettingInt(CurrentPromotion, nameof(this.UsageLimit)); 
    public string ActivePromoTile => SettingsManager.GetSettingString(CurrentPromotion, nameof(this.ActivePromoTile)); 
    public string EligiblePromoTile => SettingsManager.GetSettingString(CurrentPromotion, nameof(this.EligiblePromoTile)); 
    public string AddedPromoTile => SettingsManager.GetSettingString(CurrentPromotion, nameof(this.AddedPromoTile)); 
    public string VerifiedPromoTile => SettingsManager.GetSettingString(CurrentPromotion, nameof(this.VerifiedPromoTile)); 
} 

производный класс:

public class FreeGiftAndShippingPromotionManager : PromotionBase,IFreeGiftAndShippingPromo 
{ 
    public FreeGiftAndShippingPromotionManager() : base(PromotionHelper.PromoName.FreeGiftAndShipping) 
    { 
    } 
    private static Dictionary<int, ProductItemInfo> productItemInfos = null; 
    private static DateTime LastProductInfoRefresh = DateTime.MinValue; 
    private const int InfoRefreshInterval = 30; 
    private const int LowStockLevel = 10; 
    public override int GiftProductItemId 
    { 
     get 
     { 
      string defaultProductId = "0"; 
      if(string.IsNullOrEmpty(GiftProductItemIds).Not()) 
      { 
       defaultProductId = "0" + GiftProductItemIds.Split(',').FirstOrDefault(); 
      } 
      return Convert.ToInt32(defaultProductId); 
     } 
    } 
      public ProductItemInfo GetProductInfo(int productItemId) 
    { 
     GetFreshProductInfos(); 
     return productItemInfos[productItemId]; 
    } 
} 

производный класс интерфейса:

public interface IFreeGiftAndShippingPromo 
{ 
    DateTime? StartDate { get; } 
    DateTime? EndDate { get; } 
    string PromoCode { get; } 
    DateTime? OrderQualificationStartDate { get; } 
    DateTime? OrderQualificationEndDate { get; } 
    int PurchaseThreshold { get; } 
    int DisplayPriority { get; } 
    bool IsActive { get; } 
    string PromoTitle { get; } 
    string PromoIntro { get; } 
    int GiftProductItemId { get; } 
    string GiftProductItemIds { get; } 
    bool ShowPopup { get; } 
    bool OrderMeetsPromoMinPurchase(Order order); 
    string GetCartPromoTile(Order order); 
    bool OrderEligibleForFreeGift(Order order); 
    string EligiblePromoTile { get; } 
    string AddedPromoTile { get; } 
    string VerifiedPromoTile { get; } 
    ProductItemInfo GetProductInfo(int productItemId); 
    string GetCartProductGridDisplay(); 
} 

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

Но когда я ссылаться на интерфейс производного класса, как этот

private IFreeGiftAndShippingPromo Instance_FreeGiftAndShippingPromoManager = new FreeGiftAndShippingPromotionManager(); 

Я могу видеть ActivePromoTile свойство базового класса также со всеми другими свойствами базового класса. Могу я узнать почему? Есть ли способ, которым я могу получить только члены, объявленные в интерфейсе производного класса?

Debugger detail

Спасибо большое.

+1

Можете ли вы предоставить строку кода, которая разъясняет, что означает «Я могу видеть свойство ActivePromoTile»? (Ясно, что вы можете видеть источник и свойства в отладчике, но я сомневаюсь, что это то, что вы просите). –

+0

@AlexeiLevenkov Я добавил снимок экрана отладчика. Надеюсь, что это поможет с пониманием. Пожалуйста, дайте мне знать, если вам нужно что-нибудь еще. Я буду рад предоставить более подробную информацию. –

ответ

2

Отладчик показывает фактический тип, который хранится в интерфейсе, то есть тип, который вы видите в окне. Если вы попытались использовать ActivePromoTile в коде, код не будет компилироваться.

+0

Спасибо @Scott. Это правда, когда я пытаюсь использовать то, что он не показывает в intellisense. Мой плохой я был настолько сосредоточен на отладчике, показывая, что свойство, из-за которого я забыл попробовать использовать этот экземпляр и проверить. –

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