继承模板抽象类C#

继承模板抽象类C#,c#,generics,inheritance,abstract-class,C#,Generics,Inheritance,Abstract Class,为了节省我的写作时间,为了节省你的阅读时间,我构建了一个基本的例子来帮助我解释我试图实现的目标 假设您有一个同时使用堆栈类和队列类的程序,并且这两个类都有相同的方法/函数,最佳选择可能是创建ab抽象类并在这两个类中继承它。如果类是泛型的,那么抽象类也必须是泛型的。下面是一个抽象类的示例: public abstract class Sequence <T> { public abstract void push(T value); public abstract T

为了节省我的写作时间,为了节省你的阅读时间,我构建了一个基本的例子来帮助我解释我试图实现的目标

假设您有一个同时使用堆栈类和队列类的程序,并且这两个类都有相同的方法/函数,最佳选择可能是创建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();
}
现在,我的问题是,如何从
堆栈
继承
序列
类?
正如您可能已经注意到的那样,我试图弄清楚的是语法,而不是程序的功能。我无法找到直接适用于我的问题的解决方案。

我对您的代码做了两处更改:

为方法添加了
覆盖

实际继承

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;
    }
}
公共类堆栈:序列
{
私人名单stk;
公共堆栈()
{
stk=新列表();
}
覆盖公共无效推送(T值)
{
附加值;
}
覆盖公共T pop()
{
T topValue=peek();
stk.RemoveAt(大小()-1);
返回topValue;
}
重写公共T peek()
{
返回stk[size()-1];
}
重写公共整型大小()
{
返回stk计数;
}
覆盖公共bool isEmpty()
{
返回大小()==0;
}
}

我对您的代码做了两处更改:

为方法添加了
覆盖

实际继承

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;
    }
}
公共类堆栈:序列
{
私人名单stk;
公共堆栈()
{
stk=新列表();
}
覆盖公共无效推送(T值)
{
附加值;
}
覆盖公共T pop()
{
T topValue=peek();
stk.RemoveAt(大小()-1);
返回topValue;
}
重写公共T peek()
{
返回stk[size()-1];
}
重写公共整型大小()
{
返回stk计数;
}
覆盖公共bool isEmpty()
{
返回大小()==0;
}
}
如何从堆栈继承Sequence类

不是。首先,您需要扭转这种局面,堆栈必须从序列中派生

第二点,当
序列
只包含抽象成员时,您不妨将其设置为
接口
。从长远来看更灵活

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

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

public class Stack<T> : ISequence<T>
{    
    public void Push(T value)
    {
        stk.Add(value);
    }
    ...
}
如何从堆栈继承Sequence类

不是。首先,您需要扭转这种局面,堆栈必须从序列中派生

第二点,当
序列
只包含抽象成员时,您不妨将其设置为
接口
。从长远来看更灵活

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

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

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

+1用于在队列和堆栈类之间没有要共享的公共代码时将抽象类更改为接口。+1用于在队列和堆栈类之间没有要共享的公共代码时将抽象类更改为接口。