美文网首页
里氏转换

里氏转换

作者: 扶不起的蝌蚪 | 来源:发表于2021-08-10 19:31 被阅读0次

里氏转换的特点

  • 父类引用指向子类对象
  • 如果父类引用指向的是子类对象,那么可以将这个父类强转为子类对象
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Person p = new Student();
        }
    }
    public class Person
    {
        public void SayTeacher()
        {
            Console.WriteLine("我是Person类方法");
        }
    }
    public class Student:Person
    {
        public void SayStudent()
        {
            Console.WriteLine("我是Student类方法");
        }
    }
}
只能点出父类的方法

将父类强转为子类对象,后便可以正常调用子类的成员

class Program
    {
        static void Main(string[] args)
        {
            Person p = new Student();
            Student s = (Student)p;
            s.
        }
    }
    public class Person
    {
        public void SayPerson()
        {
            Console.WriteLine("我是Person类方法");
        }
    }
    public class Student:Person
    {
        public void SayStudent()
        {
            Console.WriteLine("我是Student类方法");
        }
    }

里氏转换的实际应用

如果有方法的参数是父类,那么我们可以传递一个子类给它
比如在string的join方法中,我们可以看到,第二个参数是Object数组,而Object是所有类的基类,那么我们就可以放任何的子类进去,在这个过程中就发生了里氏转换。

//public static String Join(String? separator, params String?[] value);
Console.WriteLine(string.Join("|", new string[] { "1", "2", "3" }));

类型转换判断

is

is检查一个对象是否强转为目标类型,若能强转返回True,否则返回False。
is操作符永远不会抛异常

class Program
    {
        static void Main(string[] args)
        {
            Person p = new Student();
            if(p is Student)
            {
                Console.WriteLine("能够强转为Student类");
            }
            if(p is Teacher)
            {
                Console.WriteLine("能够强转为Teacher类");
            }
            else
            {
                Console.WriteLine("不能够强转为Teacher类");
            }
            Console.ReadKey();
        }
    }
    public class Person
    {
        public void SayPerson()
        {
            Console.WriteLine("我是Person类方法");
        }
    }
    public class Student:Person
    {
        public void SayStudent()
        {
            Console.WriteLine("我是Person类方法");
        }
    }
    public class Teacher : Person
    {
        public void SayTeacher()
        {
            Console.WriteLine("我是Person类方法");
        }
    }

as

as表示类型转换,能给转换为目标类型,那么返回改目标类型的对象,否则返回一个空

class Program
    {
        static void Main(string[] args)
        {
            Person p = new Student();
            Student s1 = p as Student;
            s1.SayStudent();
            Console.ReadKey();
        }
    }
    public class Person
    {
        public void SayPerson()
        {
            Console.WriteLine("我是Person类方法");
        }
    }
    public class Student:Person
    {
        public void SayStudent()
        {
            Console.WriteLine("我是Person类方法");
        }
    }
    public class Teacher : Person
    {
        public void SayTeacher()
        {
            Console.WriteLine("我是Person类方法");
        }
    }

相关文章

  • 里氏转换

    里氏转换, 1子类可以赋值给父类。2如果父类中装的是子类对象,可以将这个父类强转换成子类。看看这个例子就能懂。 }

  • 里氏转换

    里氏转换的原则:1、子类可以直接赋值给父类。父类若指向子类,那么可以强制转化为该子类。 例如 static voi...

  • 里氏转换

    里氏转换的特点 父类引用指向子类对象 如果父类引用指向的是子类对象,那么可以将这个父类强转为子类对象 将父类强转为...

  • 语言规则

    1:单一职责 功能分类 2:里氏转换 父类 -> 子类 ->父类 3:依赖倒置 抽象 ->(决定) 具体

  • 设计原则二(里氏转换原则)

    子类对父类的方法尽量不要重写和重载。因为父类代表了定义好的结构,通过这个规范的接口与外界交互,子类不应该随便破坏它...

  • C#面向对象基础2

    1.里氏转换: 子类可以赋值给父类 如果父类创建的是子类对象,那么可以将父类强制转换为子类 Is可以判断一个类的对...

  • 怎么使用Newtonsoft.Json 处理存在继承关系的对象们

    面向对象编程思想中,继承 确实是个好东西:提炼共性、逻辑复用、里氏转换。多少设计模式灵感都是以此为基点迸发,可见 ...

  • JavaScript 设计模式

    设计模式 可重用、可扩展、可解耦、容易理解 目标是为了代码复用,增加可维护性 原则:对扩展开放,对修改关闭里氏转换...

  • 里氏替换原则

    里氏替换原则 “里氏替换原则(Liskov Substitution Principle,LSP)” 定义 一:(...

  • 故事派分析C#,逆变协变之协变

    知识储备:泛型接口,里氏转换 微软MSDN总是不说人话,中国翻译的编程指导书也都是故作高深,你看着这些名词的翻...

网友评论

      本文标题:里氏转换

      本文链接:https://www.haomeiwen.com/subject/iujfbltx.html