提问:既然上一篇文章说到属性可以看成是特殊的一种方法,那么可否有抽象属性(前面加abstract)呢?
既然方法可以有抽象的,那么属性也可以有,不过如果你要写成抽象属性 可能上一篇文章的两种写法就不能都用了。
public abstract class student//抽象类里的方法都是抽象的
{
public abstract int Age{get; set;}
public abstract string Name
{
get{return name;}//你会发现这种写法会报错
set{nama=value;}//这里同样报错,两个报错地方的波浪线都在get,set上
}
}
出现上述问题的原因是什么呢?
对于抽象类来说,如果有类继承自他,那么他的子类就需要对他里面的抽象函数进行完善(即实现),这就意味着,抽象类可以使每一继承自他的类对每一个抽象函数有不同的实现,但是这里你在基类就将函数实现了,就相当于个人事情做多了,下属没有东西做,产生混乱。
为什么第一个就没有报错?
第一种是语法糖,是一种简化,虽然在普通的类中好像两种等价,但其实还是有细微差别,首先将get,set当成函数理解,这样其实函数是没有实现的(没打{}),则基类并未抢下属风头。所以成立。
当基类写好,只需一个子类继承基类,然后实现抽象函数即可。
调用实现:
public abstract class Person
{
public abstract string Name{get; set;}
public abstract int Age{get; set;}
}
public class student:Person
{
private int age=10;
private string name="慕楉";
private string code="projectone";
public override string Name
{
get{return name; }
set{name=value;}
}
public override int Age
{
//get;
//set;
get{return age;}
set{age=value;}
}
public override string Code
{
//get;写成这样是不会像字段传值的,只有直接调用Code函数
//set;
get{return code;}//这样写,不管调用Code函数还是code字段,都返回最终值
set{code=value;}
}
public override string Tostring()//这个函数是object类里的,在unity中所有类继承自object类,Tostring是object类的一个虚函数,所以可以直接写
{
return "Code="+code+"Age="+age+"Name="+Name;//请注意这里的大小写对应的位置,我的大写表示的是函数,这样后面的结果才是正确的,如果你这里写成小写的,那么就是字段,如果student类中的重载函数用的不是标准的函数形式(如果用的语法糖的形式)则最后输出的就是初始值,即不会给小写传值,所以由此可以看出get,set的两种写法还是有一定区别的
}
}
Main函数里面写
student stu=new student();
stu.Name="约翰";
stu.Age=20;
stu.Code="projecttwo";
console.writeline(stu.Tostring);
原文:https://www.cnblogs.com/Nicela/p/13334908.html