当前位置: 首页 > news >正文

abstract virtual interface区别

interface用来声明接口

1.只提供方法的规则约束,不提供方法的主体。

例:

public interface IPerson

{

void getName();//不包含主体方法

}

2.方法不能用public abstract等修饰,无字段变量,无构造函数。

3.方法可包含参数

public interface IPerson

{

void getAge(string s);

}

例1

public interface IPerson

{

IPerson();//错误

string name;//错误

public void getIDcard();//错误

void getName();//正确

void getAge(string s);//正确

}

实现interface的类

1.与继承类的格式一致,如 public class Chinese:IPerson{}

2.必须实现interface中的各个方法

例2,继承例1

public class Chinese:IPerson

{

public Chinese(){}//添加构造函数

public void getName(){}//实现getName()

public void getAge(){}//实现getAge()

}

abstract用来声明抽象类、抽象方法

1.抽象方法所在类必须为抽象类。

2.抽象类不能直接实例化,必须由其派生类实现。

3.抽象方法不包含方法主体,必须由派生类以override方式实现此方法,这点跟interface中的方法类似


public abstract class Book
{
public Book()
{   
     }

public abstract void getPrice();      //抽象方法,不含主体
        public virtual void getName()   //虚方法,可覆盖
        {
      Console.WriteLine("this is a test:virtual getName()");
             }
        public virtual void getContent()   //虚方法,可覆盖
        {
      Console.WriteLine("this is a test:virtual getContent()");
             }
public void getDate()                           //一般方法,若在派生类中重写,须使用new关键字
        {
      Console.WriteLine("this is a test: void getDate()");
             }
}

public class JavaBook:Book
{
      public override void getPrice() //实现抽象方法,必须实现
      {
Console.WriteLine("this is a test:JavaBook override abstract getPrice()");
}
      public override void getName()   //覆盖原方法,不是必须的
      {
Console.WriteLine("this is a test:JavaBook override virtual getName()");
}
}

测试如下:
public class test
   {
    public test()
    {
     JavaBook jbook=new JavaBook();
     jbook.getPrice();      //将调用JavaBook中getPrice()
     jbook.getName();      //将调用JavaBook中getName()
    jbook.getContent();    //将调用Book中getContent()
     jbook.getDate();       //将调用Book中getDate()
    
    }
    public static void Main()
    {
test t=new test();
    }
   }

virtual标记方法为虚方法
1.可在派生类中以override覆盖此方法
2.不覆盖也可由对象调用
3.无此标记的方法(也无其他标记),重写时需用new隐藏原方法

abstract与virtual: 方法重写时都使用 override 关键字
interface中的方法和abstract方法都要求实现

overrid和new

//override不能重写非虚方法或静态方法。
//所重写的基方法必须是虚拟的、抽象的或重写的。
//所以说虚(virtual)成员与重写(override)成员是配对使用的,
//虽然也可以用new来"隐藏"虚成员

//下面通过例子来看看重写与隐藏的区别,从而进一步理解虚成员的作用。
//重写部分----------

public class MyBaseClass
{
  public virtual void DoSomething()
     {
       Console.WriteLine("Base imp");
     }
}

public class MyDerivedClass:MyBaseClass
{
  public override void DoSomething()
     (
       Console.WriteLine("Derived imp");
     }
}

//其中重写方法将替换基类中的执行代码,这样下面的代码就将使用替换代码,
//即使这是通过基类进行的,情况也是这样:

     MyDerivedClass myObj=new MyDerivedClass();
     MyBaseClass myBaseObj;
     myBaseObj=myObj;
     myBaseObj.DoSomething();
  
//结果如下:

     Derived imp

//另外,还可以使用下面的代码隐藏基类方法:
public class MyBaseClass
{
public virtual void DoSomething()
     {
       Console.WriteLine("Base imp");
     }
}

public class MyDerivedClass:MyBaseClass
{
  new public void DoSomething()
     {
        Console.WriteLine("Derived imp");
     }
}
//基类方法不必是虚拟的,但结果是一样的,上面的代码只需要修改行。
//对于基类的虚拟方法和非虚拟方法来说,其结果如下:
       Base imp
//尽管隐藏了基类的执行代码,但仍可以通过基类访问它。

转载于:https://www.cnblogs.com/vs2012/archive/2011/07/11/2103181.html

相关文章:

  • OpenGL教程之Alpha混合
  • 模式识别与机器学习读书笔记——2.1 Binary Variables
  • 【转】【翻译】Orx官方教程:0.基础(Basic)
  • ASP.NET——/应用程序中的服务器错误
  • 【转】【翻译】Orx官方教程:1. object
  • WEB上传文件的插件uploadify
  • 读书笔记,深入理解linux内核第三版
  • OGC标准介绍 2
  • Android游戏开发之游戏帧动画的播放与处理(七)
  • OGC标准介绍 3
  • [我研究]7月第三周
  • 查看服务器实例的属性信息函数--SERVERPROPERTY
  • 10w级别的mysql数据插入
  • 绿色 . IT . 从小事做起
  • x64 参数传递
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • css的样式优先级
  • docker python 配置
  • Redis 懒删除(lazy free)简史
  • vue的全局变量和全局拦截请求器
  • Webpack 4x 之路 ( 四 )
  • 基于游标的分页接口实现
  • 前嗅ForeSpider采集配置界面介绍
  • 算法系列——算法入门之递归分而治之思想的实现
  • 通信类
  • 微信小程序填坑清单
  • Hibernate主键生成策略及选择
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 湖北分布式智能数据采集方法有哪些?
  • 组复制官方翻译九、Group Replication Technical Details
  • # Maven错误Error executing Maven
  • #NOIP 2014# day.1 T2 联合权值
  • #QT(串口助手-界面)
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (day6) 319. 灯泡开关
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (编译到47%失败)to be deleted
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (力扣)循环队列的实现与详解(C语言)
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (学习日记)2024.02.29:UCOSIII第二节
  • (已解决)什么是vue导航守卫
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)重识new
  • .NET CLR Hosting 简介
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET Standard 的管理策略
  • .NET使用存储过程实现对数据库的增删改查
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • ?
  • @angular/cli项目构建--http(2)
  • @cacheable 是否缓存成功_Spring Cache缓存注解