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();
}
}