【问题标题】:Inheriting a template abstract class C#继承模板抽象类 C#
【发布时间】:2013-08-19 08:31:06
【问题描述】:

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

假设您有一个程序同时使用堆栈类和队列类,并且两个类具有相同的方法/功能,最佳选择可能是创建 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();
}

我们假设以下是需要继承 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 类? 正如您可能已经注意到的那样,我试图正确的是语法,而不是程序的功能。我找不到直接适用于我的问题的解决方案。

【问题讨论】:

    标签: c# generics inheritance abstract-class


    【解决方案1】:

    如何从 Stack 继承 Sequence 类?

    不是。首先,你需要扭转这种局面,Stack 必须从 Sequence 派生。

    第二点,当Sequence&lt;T&gt; 仅包含抽象成员时,您不妨将其设为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 如果您不想在 Queue 和 Stack 类之间共享公共代码,则将抽象类更改为接口的想法。
    【解决方案2】:

    我对您的代码做了 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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-08-12
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-06
      相关资源
      最近更新 更多