自己基本功不扎实,只好今天把类,子类,继承,virtual, abstract, override各种情况都试一下
规则1:覆盖父类同名函数要用new, 重写则要用override
相关代码:
class a
{
public void aaa()
{
}
}
class b : a
{
public void aaa()
{
}
}
错误提示:“b.aaa()”上要求关键字 new,因为它隐藏了继承成员“a.aaa()”
覆盖,重写区别:强制父项时,效果不一样:(a)bb.aaa();
规则2:父项要virtual, abstract, override, 才能重写
相关代码:
class a
{
public void aaa()
{
}
}
class b : a
{
public override void aaa()
{
}
}
错误提示:“b.aaa()” : 无法重写继承成员“a.aaa()”,因为它未标记为 virtual、abstract 或 override
规则3:virtual类型的要有实体
相关代码:
class a
{
public virtual void aaa();
}
class b : a
{
public override void aaa()
{
}
}
错误提示:“a.aaa()”必须声明主体,因为它未标记为 abstract 或 extern
规则4:抽象方法只能在抽象类中
class a
{
public abstract void aaa();
}
class b : a
{
public override void aaa()
{
}
}
错误提示:“a.aaa()”是抽象的,但它包含在非抽象类“a”中
规则5:抽象方法不能声明主体
abstract class a
{
public abstract void aaa()
{
}
}
class b : a
{
public override void aaa()
{
}
}
错误提示:“a.aaa()”无法声明主体,因为它被标记为 abstract
规则6:重写的类一定是子类
class a
{
public override void aaa()
{
}
}
class b : a
{
public override void aaa()
{
}
}
错误提示:“a.aaa()” : 没有找到适合的方法来重写
规则7:virtual、abstract不能并用
class a
{
public abstract virtual void aaa()
{
}
}
class b : a
{
public override void aaa()
{
}
}
错误提示:抽象方法“a.aaa()”不能标记为 virtual
但override、abstract居然可以
class a
{
public virtual void aaa()
{
}
}
abstract class b : a
{
public override abstract void aaa();
}
规则8:virtual、override不能并用
class a
{
public virtual void aaa()
{
}
}
class b : a
{
public override virtual void aaa()
{
}
}
错误提示:标记为 override 的成员“b.aaa()”不能标记为 new 或 virtual
规则9:override无法更改访问修饰符
class a
{
public virtual void aaa()
{
}
}
class b : a
{
protected override void aaa()
{
}
}
错误提示:“b.aaa()” : 当重写“public”继承成员“a.aaa()”时,无法更改访问修饰符
最后标准写法
class a
{
public virtual void aaa()
{
}
}
class b : a
{
public override void aaa()
{
}
}