C#構文練習(12):クラス[4]-抽象クラスと抽象メンバー、密封クラスと密封メンバー

3592 ワード

抽象クラスは直接インスタンス化できません:


using System;



abstract class MyClass

{

    

}



class Program

{

    static void Main()

    {

        /*  ,   */

        MyClass obj = new MyClass();



        Console.ReadKey();

    }

}


 
   

ただし、抽象クラスはサブクラスでインスタンス化できます.


using System;



abstract class Parent { }



class Child : Parent { }



class Program

{

    static void Main()

    {

        Parent obj = new Child();

        Console.WriteLine(obj.ToString()); //Child



        Console.ReadKey();

    }

}


 
   

抽象メソッドは抽象クラスにのみ含まれます.


using System;



abstract class Parent

{

    /*  ,   static   virtual   */

    public abstract void Method1();



    /*   */

    public void Method2() { Console.WriteLine("Method2"); }



    /*   */

    public static void Method3() { Console.WriteLine("Method3"); }

}



class Child : Parent

{

    /*   override */

    public override void Method1() { Console.WriteLine("Method1"); }

}



class Program

{

    static void Main()

    {

        Parent.Method3();          // Method3

        Child.Method3();           // Method3



        Parent obj = new Child();

        obj.Method1();             // Method1

        obj.Method2();             // Method2



        Console.ReadKey();

    }

}


 
   

派生クラスは、自分が抽象クラスでない限り、親の抽象メソッドを実装します.


using System;



abstract class Parent

{

    public abstract void Method1();

}



abstract class Child1 : Parent

{



}



class Child2 : Child1

{

    public override void Method1() { Console.WriteLine("Method1"); }

}



class Program

{

    static void Main()

    {

        Parent obj = new Child2();

        obj.Method1(); //Method1



        Console.ReadKey();

    }

}


 
   

抽象属性:


using System;



abstract class Shape

{

    public abstract int Area { get; }

}



class Rectangle : Shape

{

    private int FWidth, FHeight;



    public Rectangle(int w, int h)

    {

        FWidth = w;

        FHeight = h;

    }



    public override int Area

    {

        get { return FWidth * FHeight; }

    }

}





class Program

{

    static void Main()

    {

        Rectangle Rect = new Rectangle(20, 10);



        Console.WriteLine(Rect.Area); // 200



        Console.ReadKey();

    }

}


 
   

密封クラスと密封メンバー:


using System;



class Parent

{

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

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

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

}



class Child1 : Parent

{

    /*   */

    public override void  Method1() { Console.WriteLine("New Method1"); }

    public override void  Method2() { Console.WriteLine("New Method2"); }



    /*   sealed  ,   */

    public sealed override void Method3() { Console.WriteLine("New Method3"); }

}



/*   sealed  ,  ;   */

sealed class Child2 : Child1

{

    public override void Method1() { Console.WriteLine("New New Method1"); }

    public sealed override void Method2() { Console.WriteLine("New New Method2"); }

}





class Program

{

    static void Main()

    {

        Child2 obj = new Child2();

        obj.Method1(); // New New Method1

        obj.Method2(); // New New Method2

        obj.Method3(); // New Method3



        Console.ReadKey();

    }

}