继承模板抽象类C#

时间:2013-08-19 08:31:06

标签: c# generics inheritance abstract-class

为了节省一些写作,你为了节省一些阅读,我构建了一个基本的例子来帮助我解释我想要实现的目标。

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

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();
}

让我们假设以下是需要继承Stack类的Sequence类:

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;
    }
}

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

2 个答案:

答案 0 :(得分:5)

  

你将如何从Stack继承Sequence类?

不。首先,你需要转过来,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);
    }
    .... 
}

答案 1 :(得分:1)

我对您的代码进行了2次更改:

为方法添加override

实际继承

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

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

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

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

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

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

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