为了节省一些写作,你为了节省一些阅读,我构建了一个基本的例子来帮助我解释我想要实现的目标。
假设您有一个同时使用堆栈类和队列类的程序,并且这两个类具有相同的方法/函数,最佳选择可能是创建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
班级?
正如您可能已经注意到的那样,我想要做的就是语法,而不是程序的功能。我无法找到直接适用于我的问题的解决方案。
答案 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;
}
}