จะกำหนดคลาสนามธรรมทั่วไปที่สืบทอดคลาสนามธรรมทั่วไปได้อย่างไร

ฉันมีคลาสที่สืบทอดคลาสนามธรรมซึ่งสืบทอดคลาสนามธรรมอื่น ฉันสามารถกำหนดคลาสที่สุดยอดที่สุดว่าเป็นคลาสทั่วไปได้ แต่ฉันไม่รู้ว่าจะนิยามชนชั้นกลางให้เป็นคลาสทั่วไปได้อย่างไร ก่อนที่จะแสดงประเภทจริงที่ฉันต้องการในคลาส ListResults สุดท้าย

internal abstract class LowerCommand<T> {
    public abstract void Execute();
    public abstract List<T> ExecuteList();
}

// currently gives error for `T`
internal abstract class HigherCommand : Lowercommand<T> {
    // ... defines other stuff, nothing to do with
    //     already instantiated methods or T ...
}

class ListResults : HigherCommand<Results>
{
    public override void Execute() {...}
    public override List<Results> ExecuteList() {...}
}

ขอบคุณสำหรับความช่วยเหลือของคุณ.


person Robert D    schedule 19.06.2018    source แหล่งที่มา
comment
คุณควรใช้เวลาในการอ่านข้อความแสดงข้อผิดพลาดที่คอมไพเลอร์ให้ไว้ และใช้เวลาเป็นพิเศษในการไปตามลิงก์ไปยังหน้าวิธีใช้ที่ Visual Studio ให้ไว้   -  person Camilo Terevinto    schedule 19.06.2018
comment
คุณต้องกำหนด T ในลายเซ็น HigherCommand เพื่อให้ผู้ใช้สามารถส่งผ่านเข้าไปได้: HigherCommand<T>   -  person Rufus L    schedule 19.06.2018


คำตอบ (1)


คุณยังคงต้องกำหนดพารามิเตอร์ประเภททั่วไป T ตามคำจำกัดความของ HigherCommand เพื่อให้สามารถกำหนด LowerComand ได้อย่างถูกต้อง

internal abstract class LowerCommand<T> {
    public abstract void Execute();
    public abstract List<T> ExecuteList();
}

// Note that HigherCommand require a declaration of `T`
internal abstract class HigherCommand<T> : Lowercommand<T> {
    // ... defines other stuff, nothing to do with
    //     already instantiated methods or T ...
}

class ListResults : HigherCommand<Results>
{
    public override void Execute() {...}
    public override List<Results> ExecuteList() {...}
}
person dkackman    schedule 19.06.2018
comment
เจ๋งเลย ขอบคุณ ขออภัย ฉันเริ่ม C# เมื่อวานนี้ และฉันเพิ่งค้นหาสิ่งนี้ในขณะที่ฉันไป - person Robert D; 19.06.2018