public class StructTest : MonoBehaviour
{
private void Start()
{
Debug.Log("=====START====");
VCA vCA = new ClA();
vCA.Value();
vCA.ShowValue();
vCA.GetValue();
IA icA = (IA)vCA;
icA.IAShowValue();
icA.IAChangeValue();
/*
输出结果
VCA-->Value
CLA-->ShowValue
VCA-->ShowValue
CLA-->GetValue
CLA-->IAShowValue
CLA-->IAChangeValue
*/
Debug.Log("=====END====" + "\n");
Debug.Log("=====START 直接结构体类型====");
//值类型、和其他基础类型一样
StrA strA = new StrA
{
value = 1
};
StrA strB = strA;
strA.IAChangeValue();
strA.IAShowValue();
strB.IAShowValue();
/*
输出结果
StrA-->IAShowValue==>value:2
StrA-->IAShowValue==>value:1
*/
Debug.Log("=====END====" + "\n");
Debug.Log("=====START====");
IA iA = new StrA(1);
IA iB = iA;
iA.IAChangeValue();
iA.IAShowValue();
iB.IAShowValue();
/*
输出结果
StrA-->IAShowValue==>value:2
StrA-->IAShowValue==>value:2
*/
//这样定义是引用类型
Debug.Log("=====END====" + "\n");
}
public struct StrA : IA
{
public StrA(int value)
{
this.value = value;
}
public int value;
public void IAChangeValue()
{
value++;
Debug.Log("StrA" + "-->IAChangeValue");
}
public void IAShowValue()
{
Debug.Log("StrA" + "-->IAShowValue" + "==>value:" + value);
}
}
public class ClA : VCA, IA
{
public new void Value()
{
Debug.Log("CLA" + "-->Value");
}
public override void ShowValue()
{
Debug.Log("CLA" + "-->ShowValue");
base.ShowValue();
}
public override void ChangleValue()
{
base.ChangleValue();
}
public override void GetValue()
{
Debug.Log("CLA" + "-->GetValue");
}
public void IAShowValue()
{
Debug.Log("CLA" + "-->IAShowValue");
}
public void IAChangeValue()
{
Debug.Log("CLA" + "-->IAChangeValue");
}
}
public interface IA
{
void IAShowValue();
void IAChangeValue();
}
public abstract class VCA
{
public int cnt;
public virtual int Cnt
{
get { return cnt; }
set { }
}
public void Value()
{
Debug.Log("VCA" + "-->Value");
}
public virtual void ShowValue()
{
Debug.Log("VCA" + "-->ShowValue");
}
public virtual void ChangleValue() { }
public abstract void GetValue();
}
}
关于结构体
结构体不可以被继承,但是可以实现接口。生成一个结构体时如果是结构体类型的则为值类型(例如:StrA strA = new StrA),如果用接口类型则为引用类型(例如: IA iA = new StrA(1);)详见代码和输出日志
关于类
当生成类的时候是基类的类型如(例如: VCA vCA = new ClA(); 或者 IA icA = new ClA(); ),因为生成的时候为基类类型,调用方法会先找实现基类接口的方法或者重写父类方法(就是重写基类的virtual abstract 修饰的方法)的子类方法,如果没有重写就调用父类的方法,有则先调用子类的。像基类被重定义的方法,则不会先找子类调用,而是直接调用基类(如:public void Value() 方法),想见代码
参考链接:
1、关于 重写、重载、重定义说明
2、关于 overload virtual abstract 说明
https://www.cnblogs.com/akwwl/archive/2012/08/03/2622026.html