Вызов общего метода с общей коллекцией

Я только начинаю с дженериков, и я смущен тем, как реализовать следующий сценарий.

Это мой базовый класс:

public abstract class UnclaimedProperty
 {
 public abstract string Key { get; }
 public virtual void Process() { }
 public virtual void Process(string FileName) { }

 abstract public void WriteReport<t>(List<t> PropertyRecords, string FileName);
 }
</t></t>

В моих реализациях я хотел бы передать конкретный список переопределению. что-то вроде:

public class PennUnclaimed : UnclaimedProperty
{
 public override void Process(string FileName)
 {
 var reportDollarRecords = new List<pennunclaimed>();
 //add items here
 WriteReport(reportDollarRecords, "PennCash");
 }

 public override void WriteReport(List<unclaimedproperty> PropertyRecords, string FileName)
 {
 //write report here
 }
</unclaimedproperty></pennunclaimed>

}

Я получаю ошибку:

'PennUnclaimed' does not implement inherited abstract member
 'UnclaimedProperty.WriteReport<t>(List<t>, string)'
</t></t>

Каким будет правильный способ реализации этого?

1 ответ

Основываясь на ваших комментариях, рассмотрите вопрос об использовании абстрактного класса.

public abstract class UnclaimedProperty<t> where T : UnclaimedProperty<t> {
 public abstract string Key { get; }
 public virtual void Process() { }
 public virtual void Process(string FileName) { }

 abstract public void WriteReport(List<t> PropertyRecords, string FileName);
}
</t></t></t>

Таким образом, реализация будет выглядеть так

public class PennUnclaimed : UnclaimedProperty<pennunclaimed> {
 public override void Process(string FileName) {
 var reportDollarRecords = new List<pennunclaimed>();
 //add items here
 WriteReport(reportDollarRecords, "PennCash");
 }

 public override void WriteReport(List<pennunclaimed> PropertyRecords, string FileName) {
 //write report here
 }

 public override string Key {
 get {
 return string.Empty; //TODO:return key 
 }
 }
}
</pennunclaimed></pennunclaimed></pennunclaimed>

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

licensed under cc by-sa 3.0 with attribution.