c# - 继承模板抽象类C#

标签 c# generics inheritance abstract-class

为了节省我自己的写作时间,也为了节省您的阅读时间,我构建了一个基本示例来帮助我解释我想要实现的目标。

假设您有一个同时使用堆栈类和队列类的程序,并且这两个类具有相同的方法/功能,最佳选择可能是创建一个抽象类并在两个类中继承它。如果类是通用的,那么抽象类也必须是通用的。所以这里有一个抽象类的例子:

public abstract class Sequence <T>
{
    public abstract void push(T value);
    public abstract T pop();
    public abstract T peek();
    public abstract int size();
    public abstract bool isEmpty();
}

并且假设以下是需要继承Sequence类的Stack类:

public class Stack<T>
{
    private List<T> stk;

    public Stack ()
    {
        stk = new List<T>();
    }

    public void push(T value)
    {
        stk.Add(value);
    }

    public T pop()
    {
        T topValue = peek();
        stk.RemoveAt(size () - 1);
        return topValue;
    }

    public T peek()
    {
        return stk[size() - 1];
    }

    public int size()
    {
        return stk.Count;
    }

    public bool isEmpty()
    {
        return size() == 0;
    }
}

现在,我的问题是,如何从 Stack 继承 Sequence 类? 正如您可能已经注意到的那样,我试图做对的是语法,而不是程序的功能。我找不到直接适用于我的问题的解决方案。

最佳答案

how would you inherit the Sequence class from Stack?

不是。首先,您需要扭转局面,Stack 必须派生自 Sequence。

第二点,当Sequence<T>只包含抽象成员你不妨把它变成一个 interface .从长远来看更灵活。

而且实际的语法并没有那么复杂:

public interface ISequence <T>
{
    void Push(T value);
    T Pop();
    ...
}

public class Stack<T> : ISequence<T>
{    
    public void Push(T value)
    {
        stk.Add(value);
    }
    ...
}

(我将大写更改为标准 C# 约定)

同样的语法适用于 abstract class Sequence :

public class Stack<T> : Sequence<T> 
{ 
    public override void Push(T value)
    {
        stk.Add(value);
    }
    .... 
}

关于c# - 继承模板抽象类C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18309470/

相关文章:

具有特定类型的 List 上的 C# 扩展方法

C#不继承基类的构造函数

c# - Windows Azure VM 上的 WCF wsdualhttpbinding 绑定(bind)

c# - C# 中的 Rijndael key 大小

c# - 最好的 GridFS C# 驱动程序?

java - 在 Java 的父类(super class)构造函数中调用抽象方法

java - OOM中如何设计这个案例

c# - 最佳重载方法匹配...有一些无效参数 [byref/byval]

generics - 为泛型类型实现均值函数

java - Google Guice - 使用泛型作为注入(inject)字段的参数