A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

我先来一个对里氏替换原则的理解:
LSP---Liskov Substitution Principle(里氏替换原则):子类必须能够替换其基类
    public class DemoA
    {
        public void Method()
        {
            Console.WriteLine("基类方法!");
        }
        public virtual void Show()
        {
            Console.WriteLine("基类方法!");
        }
    }
    public class DemoB : DemoA
    {
        public void Method()
        {
            Console.WriteLine("子类方法!");
        }
        public override void Show()
        {
            Console.WriteLine("子类方法!");
        }
    }
    public class Program
    {
        static void Main(string[] args)
        {
            DemoA demo = new DemoB();
            demo.Method();//不能隐式的实现子类的方法,违反里氏替换原则
            demo.Show();//子类必须能够替换其基类,符合里氏替换原则
            Console.ReadKey(true);
        }
    }

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

2 个回复

倒序浏览
C#的继承与 C++ 等语言一个重要的不同,就是只能从一个类中继承,这是开发者在权衡了从多个类C#继承的优势与劣势作出的结果。不过,可以从接口继承。另外,继承可传递。构造函数和析构函数不能被继承。

初始化基类

可以在派生类构造函数中添加初始化基类的代码。

public class BaseClass  
{  
    private int i = 0;  
      
    public BaseClass(int index)  
    {  
        i = index;  
    }  
}  


public class DerivedClass : BaseClass  
{  
    private int j = 0;  
      
    public DerivedClass(int index) : base(index)  
    {  
        j = index;  
    }  
}
注意派生类构造函数中的 : base(index)。将先调用基类的构造函数。

另外,相对于 this,要访问基类的成员,可以使用 base,当前这不能用在静态方法中,因为静态方法没有实例。

C#继承中的重写

◆virtual 用在基类中,指定一个虚方法(属性),表示这个方法(属性)可以重写。

◆override 用在派生类中,表示对基类虚方法(属性)的重写。

以上的基类和派生类都是相对的。B 是 C 的基类,也可以是 A 的派生类,B 中既可以对 A 中的 virtual 虚方法用 override 重写,也可以指定 virtual 虚方法供 C 重写。

不能重写非虚方法或静态方法。重写的基方法必须是 virtual、abstract 或 override 的。为什么 override 也可以重写呢?因为基类中的 override 实际上是对基类的基类进行的重写,由于继承可传递,所以也可以对基类中 override 的方法进行重写。

◆override 声明不能更改 virtual 方法的可访问性。override 方法和 virtual 方法必须具有相同的访问级别修饰符。
不能使用修饰符 new、static、virtual 或 abstract 来修改 override 方法。

◆重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且被重写的属性必须是 virtual、abstract 或 override 的。

public class BaseClass  
{  
    public virtual string GetString()  
    {  
        return "这是一个虚方法。";  
    }  
}  


public class DerivedClass : BaseClass  
{  
    public override string GetString()  
    {  
        return "这是重写了的方法。";  
    }  
}
可以看出,重写与前面讲的重载是有区别的。

C#继承中的方法重载

方法重载并不是类继承中的内容,只是它容易和重写等混淆,所以放在一起谈谈。

什么是重载呢,举个例子,我们在应用 System.IO.File.Create() 方法时,往往可以选择几种参数,这是就方法的重载,同一个作用域、同一个方法名称、具有不同的参数类型或参数个数,在调用方法时,根据参数自动决定使用哪一个方法。

示例

public string GetString()  
{  
    //...  
}  

public string GetString(int index)  
{  
    //...  
}  

public string GetString(string userName)  
{  
    //...  
}

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
个人理解,所有的东西都可以理解为一个具体的对象,某一类具体的东西又可以抽象化,提取共同特征,共同行为,对特征和行为提供了封装特性,同时行为提供了对象之间的通信形式。对象之间的继承关系,多态特性,这方面的网上介绍的很多,可以参考一些简单示例去了解。如果说的有什么偏差,还望修正

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马