一颗不安分的创业心

C#细节之Interface和abstract class

Interfaceabstract class
OOP必谈面向“接口”编程,此接口并非仅指“Interface”,它包括“接口”和“抽象类”。
OOP中的原则很多,什么SRP,OCP,DIP,ISP,LSP。
“接口”和“抽象类”又与DIP(依赖倒置原则)密切相关。DIP强调的是依赖抽象不依赖实际,这样可以降低系统的耦合性。举个简单的例子:
Man man = new Man();
man.Talk();
这样耦合性很高,如果改为Women两行代码都需要修改,所以演化为(Human为抽象类,依赖抽象):
Human human= new Man();
human.Talk();
如果该为Women的话就修改new Man()为new Women()即可。当然这样还是有耦合性,解决方案可以参考我设计模式文章中关于工厂的介绍,这里先写个代码供大家思考:
Human human = humanFactory.CreateHuman("xxxx");//简单工厂
human.Talk();
然而接口和抽象类的区别是什么那?
1)接口没有任何实现,抽象类可以包含实现。
2)接口支持多继承,抽象类不支持多继承。
3)继承接口的类实现接口成员时不需要其他关键字,继承抽象类的类实现抽象类成员时需要用到override或者new。
4)接口继承分为显示继承和隐式继承。隐式继承需要访问修饰符,显示不需要访问修饰符,直接用[接口名].[函数名]。
另:
override只能重写标记为virtual,abstract,override的成员。
显示实现的接口函数需要用接口对象调用,不能用实现接口的类的对象调用;隐式实现的接口均可调用。
new标记的成员当用父类对象调用时调用的是父类的方法,override标记的成员当用父类对象调用时调用的是子类的方法。
一下是代码:
复制代码
using System;

class Stater
{
    
static void Main()
    {
        
//抽象类
        AbstractClass abstractClass = new TestTwo();
        abstractClass.Init();
        abstractClass.Show();
        abstractClass.ShowTwo();
//new覆盖,调用父类方法
        abstractClass.ShowThree();//override重写,调用子类方法
        TestTwo ttObj = new TestTwo();
        ttObj.Init();
        ttObj.Show();
        ttObj.ShowTwo();
//new覆盖,调用子类方法
        ttObj.ShowThree();//override重写调用子类方法
        
//接口
        IInterface iinterface = new Test();
        iinterface.Init();
        iinterface.Show();
        Test test 
= new Test();
        
//test.Init();//Error:显示声明只能接口调用
        test.Show();
    }
}

abstract class AbstractClass
{
    
public void Init()
    {
        Console.WriteLine(
"AbstractClass Init.");
    }

    
public abstract void Show();

    
public virtual void ShowTwo()
    {
        Console.WriteLine(
"AbstractClass ShowTwo.");
    }

    
public virtual void ShowThree()
    {
        Console.WriteLine(
"AbstractClass ShowThree.");
    }
}

interface IInterface
{
    
string Property { get;}
    
void Init();
    
void Show();
}

class Test : IInterface
{
    
public string Property
    {
        
get
        {
            
return "Property";
        }
    }
    
void IInterface.Init()
    {
        Console.WriteLine(
"Interface Init.[显示]");
    }

    
public void Show()
    {
        Console.WriteLine(
"Interface Show.[隐式]");
    }
}

class TestTwo : AbstractClass
{
    
public override void Show()
    {
        Console.WriteLine(
"TestTwo show.");
    }

    
public new void ShowTwo()
    {
        Console.WriteLine(
"TestTwo showtwo.");
    }

    
public override void ShowThree()
    {
        Console.WriteLine(
"TestTwo showthree.");
    }
}
复制代码



posted @   pangxiaoliang[北京]流浪者  阅读(611)  评论(2编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
小豆芽之父
点击右上角即可分享
微信分享提示