我有這個包含其他類串列的基類
public class Blacklist
{
public int Id { get; set; }
public virtual IEnumerable<Card> Cards { get; set; }
}
Card類的樣子
public class Card
{
public int Id { get; set; }
public string Cuid { get; set; }
public int BlacklistId { get; set; }
}
然后我實作了一個擴展 Blacklist 類的派生類
public class BlacklistTwo : Blacklist
{
public new IEnumerable<CardTwo> Cards { get; set; }
}
其中 CardTwo 類擴展了基礎 Card 類
當我嘗試使用派生實體呼叫接受基類作為引數的方法時,就會出現問題。外部類的型別沒問題,但卡片的型別仍然作為基類實作。
例子:
Insert(
new BlacklistTwo(){
Id = 1,
Cards = new List<CardsTwo>()
{ new CardTwo() { Id = 123123, Cuid = "123213", BlacklistId = 1}});
public void Insert(Blacklist blacklist)
{
blacklist.GetType(); // returns BlacklistTwo
blacklist.Cards.GetType(); // returns IEnumerable<Card> insted of IEnumerable<CardTwo>
}
當我將方法的引數設定為動態時它可以作業,但如果可能的話我想避免它。
uj5u.com熱心網友回復:
正如評論中所指出的那樣 - 您實際上并沒有覆寫該屬性,因為您使用了 'new' 關鍵字。我認為這可能是您想要實作的目標:
public interface ICard
{
int CardId { get; set; }
string Cuid { get; set; }
int BlacklistId { get; set; }
//.. Other methods and properties
}
public class Card : ICard
{
public int CardId { get; set; }
public string Cuid { get; set; }
public int BlacklistId { get; set; }
}
public class CardTwo : ICard
{
public int CardId { get; set; }
public string Cuid { get; set; }
public int BlacklistId { get; set; }
}
public class Blacklist
{
public int Id { get; set; }
public virtual IEnumerable<ICard> Cards { get; set; }
}
public class BlacklistTwo : Blacklist
{
public override IEnumerable<ICard> Cards { get; set; }
}
接著:
public Test()
{
ICard card1 = new Card();
card1.CardId = 123123;
card1.Cuid = "123213";
card1.BlacklistId = 1;
ICard card2 = new CardTwo();
card2.CardId = 123123;
card2.Cuid = "123213";
card2.BlacklistId = 1;
Insert(new BlacklistTwo()
{
Id = 1,
Cards = new List<ICard>() { card1 ,card2 }
});
if (card1 is Card c1)
{
//Yes - this is a type of Card
}
if (card2 is CardTwo c2)
{
//Yes - this is a type of CardTwo
}
}
您可以使用介面或抽象類,甚至可能避免擴展黑名單類
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/489677.html
上一篇:指向子與父的函式指標
下一篇:Java子類用超類的引數初始化
