Я создаю абстрактный базовый класс со свойствами и наследую этот базовый класс в производном классе. Производный класс наследует базовый класс, а также интерфейс. Когда я пытаюсь ссылаться на объект производного класса с помощью интерфейса, я также вижу свойства базового класса, которые не объявлены в интерфейсе производного класса. Оригинальный код немного большим, но следующий такой же подход я следуюПочему ссылка на интерфейс производного класса показывает поле базового класса?
Базовый класс:
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 свойство базового класса также со всеми другими свойствами базового класса. Могу я узнать почему? Есть ли способ, которым я могу получить только члены, объявленные в интерфейсе производного класса?
Спасибо большое.
Можете ли вы предоставить строку кода, которая разъясняет, что означает «Я могу видеть свойство ActivePromoTile»? (Ясно, что вы можете видеть источник и свойства в отладчике, но я сомневаюсь, что это то, что вы просите). –
@AlexeiLevenkov Я добавил снимок экрана отладчика. Надеюсь, что это поможет с пониманием. Пожалуйста, дайте мне знать, если вам нужно что-нибудь еще. Я буду рад предоставить более подробную информацию. –