c# 抽象类

今天在看一个面试题目在一个抽象类里面看到一个构造函数,感到很奇怪;

1  我记得抽象类不能实例化,但是构造函数主要用于实例化一个对象和对函数的变量赋值,既然抽象函数不能实例化那还需要这个构造函数干什么呢于是查阅啦相关资料和在群里发问

于是有啦我写这篇文章的想法

我们先来了解一下抽象类的基本概念

abstract 修饰符可以和类、方法、属性、索引器及事件一起使用。在类声明中使用 abstract 修饰符以指示某个类只能是其他类的基类。标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。

例如

 abstract class ShapesClass
{
    abstract public int Area();
}
class Square : ShapesClass
{
    int x, y;
    public override int Area()
    {
        return x * y;
    }
}

抽象类具有以下特性:

1  不能实例化

2  抽象类可以包含抽象方法和抽象访问器

3 不能用 sealed修饰符修改抽象类,这意味着抽象类不能被继承。(因为sealed是一个密封类不能继承)

4  从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现。

5 只允许在抽象类中使用抽象方法声明

6 因为抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在签名后没有大括号 ({ })。例如:

public abstract void MyMethod();

7 在抽象方法声明中使用 staticvirtual 修饰符是错误的。因为抽象方法本来就已经是一个虚方法。抽象方法不能直接通过抽象类调用

必须通过之类去实现后才能用。

8  抽象类的不能直接实例化而已,必须通过具体继承类来间接实例化,抽象类本身高于继承类,有很多通用的数据必须在继承类实例化之前初始化,所以抽象类必须要有构造函数

示例

在本例中,DerivedClass 类是从抽象类 BaseClass 派生的。抽象类包含一个抽象方法 AbstractMethod 和两个抽象属性 XY

using System;
abstract class BaseClass   // 抽象类

{
    protected int  x = 100;
    protected int  y = 150;
    public abstract void AbstractMethod();   // 抽象方法
    public abstract int X    { get(return x); }
    public abstract int Y    { get(return y); }
}

class DerivedClass : BaseClass
{
    public override void AbstractMethod()
    {
        x++;
        y++;
    }

    public override int X   // overriding property
    {
        get
        {
            return x + 10;
        }
    }

    public override int Y   

    {
        get
        {
            return y + 10;
        }
    }

    static void Main()
    {
        DerivedClass o = new DerivedClass();
        o.AbstractMethod();
        Console.WriteLine("x = {0}, y = {1}", o.X, o.Y);
    }
}

有兴趣的朋友能说一下这个最后输出多少?


posted on 2012-07-15 21:41  361741352  阅读(241)  评论(0编辑  收藏  举报

导航