我正在创建一个抽象基类,其中包含由其他类实现的函数.我的怀疑如下
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; } };
解决方法
>对于在抽象类中没有实现的方法,也使用abstract:
abstract public void Draw(); abstract public float getWidth(); abstract public void Swap(); abstract public void Erase();
>默认情况下,方法不可覆盖;如果声明为abstract,virtual或override(但不覆盖密封),它们只允许派生类重写.
因此,您不需要为getShapeDetails()提供除public之外的任何其他修饰符:
public ShapeDetails getShapeDetails() { return _shapedDetails; }
另外,您应该坚持使用.NET命名约定并使用Pascal大小写大写方法名称,因此getWidth()变为GetWidth(),getShapeDetails()变为GetShapeDetails().
实际上你应该为你的_shapedDetails字段使用property getter而不是getShapeDetails()方法:
private ShapeDetails _shapedDetails; public ShapeDetails ShapedDetails { get { return _shapedDetails; } }