2013-08-19 201 views
1

爲了節省我自己的一些寫作,您爲了節省您一些閱讀,我構建了一個基本示例來幫助我解釋我想實現的目標。如果你有一個既使用棧類又使用隊列類的程序,並且這兩個類都有相同的方法/函數,那麼最佳選擇可能是創建ab抽象類並在兩個類中繼承它。如果這些類是通用的,那麼抽象類也必須是通用的。因此,這裏的抽象類會是什麼樣子的例子:繼承一個模板抽象類C#

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

現在,我的問題是,你會如何繼承StackSequence類? 正如您可能已經注意到的那樣,我想要正確的是語法,而不是程序的功能。我無法找到直接適用於我的問題的解決方案。

回答

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

你會如何繼承棧序列類?

不是。首先,你需要把這個轉過來,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); 
    } 
    .... 
} 
+0

+1因爲如果沒有想要在Queue和Stack類之間共享的通用代碼,將抽象類更改爲接口的想法。 –