首页 > 开发 > 综合 > 正文

c#中的interface abstract与virtual

2024-07-21 02:17:51
字体:
来源:转载
供稿:网友
 

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();         //right
   void getage(string s);  //right
   }

实现interface的类
1.与继承类的格式一致,如 public class chinese:iperson{}
2.必须实现interface中的各个方法

   例2,继承例1
    public class chinese:iperson
  {
   public chinese(){}             //添加构造
   public void getname(){}        //实现getname()
   public void getage(string s){} //实现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方法都要求实现

菜鸟学堂:
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表