OOP(里氏替换原则 ,抽象类,接口)

LSP:里氏替换原则

* 原则上来讲,子类对象可以赋给父类对象,也可以说子类替换父类,并且出现在父类能过出现的任何地方

*

* 反过来说,父类对象时不能替换子类对象的,这种特性称为里氏替换原则

* 1.子类可以隐士的转换为父类对象

* 2.父类必须强转子类

*

* is&&as

* is :相当于判断,A is B A是不是B或者说A是不是B的子类?

* as :先判断在转换,(他比传统的强之转换相对安全,因为传统的强值转换,一旦转换失败,程序就崩溃了,)

*

* B b;定义栈上的引用变量b,此时是空引用,也就是null 存于栈,用来保存将来引用对象的地址

* b=new B:通过new关键词创建B类的对象,对象的实例保存在托管堆,CRl在建立实例对象的时候,

* 还回创建它的类型对象

* ,对象实例在堆中的内存包括,字段,类型对象指针,同步索引块,类型对象指针指向的是类型对象

*

* 类型对象在堆中的内存包括类型对象指针,索引块,静态字段,方法列表

*

* A a=new B

* ;声明一个类型为A的引用类型a,并将其实际地址指向B所指向的那个对象实例

*

* a.MethodF();

* 当调用一个方法的时候,会直接检查这个对象的类型,首先找到堆中的类型对象,查看其是否有该方法,

* 如果有,直接调用,如果没有,则通过类型对象的类型对象指针向上继续查找,直到找到该方法,

* 找到该方法之后,他会先检查该方法是否为Virtula,如果非虚直接调用,如果是需方法,既有virtual修饰的关键词

* 则会引用变量a,去找对象的实例类B,查找该方法是否重写了该虚方法,如果有,执行,没有继续向上查找,直到找到为止

*

* 由于MetthodG为需方法既会找到实例B,又由于B重写了MetthodG,所以直接输出

*

*/什么是抽象方法

*

* 抽象类:

* 在程序中使用关键字abstract

*

* 如果说正常类是一个完整类,抽象类实际上是一个不完整的类

*******************************************************************************************************

* 抽象类的特点

* 1.如果类中存在抽象方法,那么该方法不能有实现部分,该方法只能有声名

* 2.含有抽象方法的类一定是抽象类

* 3.抽象类不一定含有抽象方法

* 4.如果子类继承子类的父类为抽象类并且还有抽象方法,子类必须重写父类抽象方法并且实现

* 5.virtual和abstract不能使用private修饰符,要用public修饰符

* 6.virtual不能和abstract放在一起

* 7.抽象类不能被实例化

* 8.抽象类可以包含静态成员

*

* 抽象类的作用:

* 父类约束子类行为

**********************************************************************************************

* 接口:接口就是公共契约

* 接口的关键字:interface

* 接口和类属于同级关系,属于C#中的编程单位

* 接口也被叫纯洁的抽象类

*

* 接口特点:

* 1.不能有字段

* 2.接口内不能有修饰符

* 3.接口中不能有方法体(方法实现)

* 4.接口同样不可以被实例化

* 5.接口里面成员总是公共的

* 6.接口中可以有属性但是不能有修饰符

* 7.接口中可以有索引器/事件声明

* 8.接口中生命的方法子类实现的时候子类虽然也用override关键字,但是记住不属于重写,这里不能把override显示的声明出来

*

* 开发准则:尽量多用接口,能用接口不用抽象类,能用抽象类就不用虚方法

* 动态多态性


//里氏替换原则

class Person           //父类

{

public void Say()

{

Console.WriteLine ("父类");

}

}

class Zhang:Person        //子类

{

public new  void Say()

{

Console.WriteLine ("张说");

}

}

class Li:Person

{

public  new void Say( )

{

Console.WriteLine ("李说");

}

}

class MainClass

{

public static void Main (string[] args)

{

// Person p = new Zhang ();

// p.Say ();

//

// Person p1 = new Li ();

// Person p2 = p1;//编译通过

//

// Li l1 = p1;//编译不通过,因为父类必须强转子类

// Li l1 = (Li)p1;

// Person p=new Zhang();

// Zhang z = (Zhang)p;

// //子类和子类

// Zhang z1=new Zhang();

// Li l1 = new Li ();

//

// z1 = (Zhang)l1;//编译不通过

Person p1 = new Zhang ();

if (p1 is Zhang) {

Zhang z1=p1 as Zhang;

z1.Say();

}

else {

Console.WriteLine ("______-_-___");

}

}

//抽象类

//练习:Shap类,表示一个形状的抽象类

//该类包含一个求圆形面积的抽象方法Area()

//请从Shap的派生类,梯形,圆形,三角形,菱形实现各自的面积.


abstract class Shap{

public abstract void Area();

}

class Pai:Shap{

public int r;

public Pai(int r)//

{

this.r=r;

}

public override void Area ()

{

double m = r * r * 3.14;

Console.WriteLine ("圆形的面积为:{0}",m);

}

}

class Sanjiao:Shap

{

public int r;

public int a;

public override void Area ()

{

double m = r*a/2;

Console.WriteLine ("三角形的面积为:{0}",m);

}

}

class Tixing:Shap

{

public int r;

public int a;

public int c;

public Tixing(int r,int a ,int c)

{

this.a=a;

this.c=c;

this.r=r;

}

public override void Area ()

{

double m = (r+a)*c/2;

Console.WriteLine ("梯形的面积为:{0}",m);

}

}

class Linxing:Shap

{

public int a;

public int b;

public Linxing(int a,int b)

{

this.a=a;

this.b=b;

}

public override void Area ()

{

int  m = a * b;

Console.WriteLine ("菱形的面积为:{0}",m);

}

}

class MainClass

{

public static void Main (string[] args)

{

//new Huang ().Say ();

//需要计算面积用到的参数,请自己想办法解决.

Pai p=new Pai(4);

p.Area ();

Sanjiao s = new Sanjiao ();

s.a = 6;

s.r = 3;

s.Area ();

Tixing t = new Tixing (4, 6, 6);

t.Area ();

Linxing l = new Linxing (5, 9);

l.Area ();

}


//接口

interface IInput

{

void Read();

}

interface IInputTwo

{

void Read();

}

class Test:IInput,IInputTwo

{

public string name;

//如果接口出现方法同名情况需要以下列方式实现,但是调用的时候

//要用动态多态性调用,非常规调用方式

// public void IInput.Read(){

// Console.WriteLine ("1111");

// }

//

// public void IInputTwo.Read(){

// Console.WriteLine ("2222");

// }

public void Read(){

Console.WriteLine ("1111");

}

// public void Read(){

// Console.WriteLine ("2222");

// }

public IInput T(){

Test t = new Test ();

t.name = "测试返回接口实例";

return t;

}

}

class MainClass

{

public static void Main (string[] args)

{

// new Test ().Read ();

//返回接口实例

Test t = new Test();

Console.WriteLine (t.name);

Test t1 = (Test)t.T ();

Console.WriteLine (t1.name);

// Test t = new Test ();

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,183评论 6 516
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,850评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,766评论 0 361
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,854评论 1 299
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,871评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,457评论 1 311
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,999评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,914评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,465评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,543评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,675评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,354评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,029评论 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,514评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,616评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,091评论 3 378
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,685评论 2 360

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,664评论 18 399
  • 1. [C#语言基础]请简述拆箱和装箱。 答: 装箱操作: 值类型隐式转换为object类型或由此值类型实现的任何...
    胤醚貔貅阅读 4,809评论 1 29
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,707评论 18 139
  • 目录本次给大家介绍的是我收集以及自己个人保存一些.NET面试题第二篇简介1.接口2.您在什么情况下会用到虚方法或抽...
    寒剑飘零阅读 1,984评论 0 10
  • 前两天参加一个峰会,某位企业家说,我们一定要去美国纽约时代广场,占据最大的广告屏幕,让中国货和五星红旗飘扬在美利坚...
    韦青青青阅读 524评论 0 0