一颗不安分的创业心

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 @ 2009-07-28 15:23  pangxiaoliang[北京]流浪者  阅读(608)  评论(2编辑  收藏  举报
小豆芽之父