C#继承问题

log*_*eks 6 .net c# oop inheritance

我正在创建一个抽象基类,其中包含由其他类实现的函数.我的怀疑如下

1)我是否需要在每个需要被子类覆盖的函数前面给出"虚拟"?我看到一些没有虚拟关键字的示例,但仍然可以覆盖它们.

2)我需要有一个将在基类中实现的函数,我不希望它被子类重写.我添加了该功能的"固定"关键字.编译器开始抱怨"成员"无法密封,因为它不是覆盖.我在这里做错了吗?

abstract public class ShapeBase
    {
        private ShapeDetails _shapedDetails;

        public CampusCardBase(ShapeDetails shDetails)
        {
            _shapedDetails= shDetails;
        }

        public virtual void Draw();
        public virtual float getWidth();
        public virtual void Swap();
        public virtual void Erase();

        public sealed ShapeDetails getShapeDetails()
        {
            return _shapedDetails;
        }


    };
Run Code Online (Sandbox Code Playgroud)

Bol*_*ock 9

  1. 对于在抽象类中没有实现的方法,也可以使用abstract:

    abstract public void Draw();
    abstract public float getWidth();
    abstract public void Swap();
    abstract public void Erase();
    
    Run Code Online (Sandbox Code Playgroud)
  2. 默认情况下,方法不可覆盖; 它们只允许派生类在声明时覆盖abstract,virtual或者override(但不是override sealed).

    因此,您不需要提供getShapeDetails()任何其他修饰符public:

    public ShapeDetails getShapeDetails()
    {
        return _shapedDetails;
    }
    
    Run Code Online (Sandbox Code Playgroud)

在旁注中,您应该坚持使用.NET命名约定并使用Pascal大小写大写方法名称,因此getWidth()变为GetWidth()getShapeDetails()变为GetShapeDetails().

实际上,您应该为您的字段使用属性 getter _shapedDetails而不是getShapeDetails()方法:

private ShapeDetails _shapedDetails;

public ShapeDetails ShapedDetails
{
    get { return _shapedDetails; }
}
Run Code Online (Sandbox Code Playgroud)

  • "sealed关键字仅适用于类声明,而不适用于方法声明" - 它*可以*应用于方法:`override sealed`覆盖虚拟/抽象方法并阻止下游覆盖. (5认同)