抽象クラスインタフェースabstract virtualとか混同しないで
13899 ワード
△最近、初心者を連れて入門するのは大変です.
インタフェースと抽象クラスはすべてクラスの抽象にすぎない.これは彼らの本質であり、人々の思考角度が異なるだけで、行為契約上の抽象(インタフェース)に偏っている.自然の繁殖関係(抽象クラス)に似ている.
直接コード:
まとめてみます:抽象クラスとインタフェースはすべてクラスの抽象で、インタフェースは更に行為の方面から抽象に関心を持って、文法の上でインタフェースの内容はすべて実現していない必要があって、完全に後ろのクラスを待って実現しますこの点で、抽象クラスは1つの完全に実現していないクラスのようで、彼はすべての普通のクラスのように、フィールド、属性、および方法を持つことができますと思って、これらはすべて具体的な実装体を持つことができるが、このようにすれば、彼と普通のクラスの違いはnewインスタンス化できないことにあるだけで、彼の本当の違いはabstract修飾の部分があるべきで、この部分は具体的に実装されていないので、後の実装クラスによって具体的に実現しなければならない.virtualキーワードはもともとここの討論の範疇に属するべきではなくて、彼の修飾の方法は普通の方法とほとんど同じで、すべて方法体を持っていて、しかしvirtualに修飾された布団類に書き換えることができます.
例を挙げてmvcのコントローラモジュールをシミュレートします
インタフェースと抽象クラスはすべてクラスの抽象にすぎない.これは彼らの本質であり、人々の思考角度が異なるだけで、行為契約上の抽象(インタフェース)に偏っている.自然の繁殖関係(抽象クラス)に似ている.
直接コード:
class
{
public static void Main(string[] args)
{
ChinesePerson c = new ChinesePerson("xx", 23);
c.Run();
c.Speak();
Console.WriteLine(c.Name);
Console.WriteLine(c.Age);
Console.WriteLine(c.Hobby);
Console.WriteLine("--------");
c.fight();
JiangSuPerson j = new JiangSuPerson();
j.Name = "xiaomao";
j.Age = 24;
j.Run();
j.Speak();
j.fight();
j.sing();
Console.WriteLine(j.Name);
Console.WriteLine(j.Age);
Console.WriteLine(j.Hobby);
Console.WriteLine("----------");
HenanPerson h = new HenanPerson();
h.Name = "linyi";
h.Speak();
h.fight();
h.sing();
Console.ReadKey();
}
}
public interface IRun
{
void Run();
}
public abstract class Person : IRun
{
private string name;
private int age;
public string Name
{
get { return name; }
set { name = value; }
}
public int Age
{
get { return age; }
set { age = value; }
}
public abstract string Hobby { get; set; }
public Person(string name, int age)
{
this.Name = name;
this.Age = age;
}
public Person()
{ }
public abstract void Speak();
public void Run()
{
Console.WriteLine("Running ~~");
}
// abstract virtual ,
// ,abstract , virtual , virtual 。
public virtual void fight()
{
Console.WriteLine("fighting");
}
}
public class ChinesePerson : Person
{
public ChinesePerson(string name, int age)
: base(name, age)
{
this.Name = name;
this.Age = age;
}
public ChinesePerson()
{
}
public override void Speak()
{
Console.WriteLine(" ");
}
public override string Hobby
{
get
{
return "shopping";
}
set
{
}
}
public override void fight()
{
base.fight();
Console.WriteLine("chinese gongfu fighting");
}
public virtual void sing()
{
Console.WriteLine(" ");
}
}
// ,
public class JiangSuPerson : ChinesePerson
{
}
public class HenanPerson : ChinesePerson
{
public override void Speak()
{
Console.WriteLine(" ");
}
public override void sing()
{
Console.WriteLine(" ");
}
}
まとめてみます:抽象クラスとインタフェースはすべてクラスの抽象で、インタフェースは更に行為の方面から抽象に関心を持って、文法の上でインタフェースの内容はすべて実現していない必要があって、完全に後ろのクラスを待って実現しますこの点で、抽象クラスは1つの完全に実現していないクラスのようで、彼はすべての普通のクラスのように、フィールド、属性、および方法を持つことができますと思って、これらはすべて具体的な実装体を持つことができるが、このようにすれば、彼と普通のクラスの違いはnewインスタンス化できないことにあるだけで、彼の本当の違いはabstract修飾の部分があるべきで、この部分は具体的に実装されていないので、後の実装クラスによって具体的に実現しなければならない.virtualキーワードはもともとここの討論の範疇に属するべきではなくて、彼の修飾の方法は普通の方法とほとんど同じで、すべて方法体を持っていて、しかしvirtualに修飾された布団類に書き換えることができます.
例を挙げてmvcのコントローラモジュールをシミュレートします
// MVC
class
{
public static void Main(string[] args)
{
IController ic;
ic = new HomeController();
ic.Execute();
Console.ReadKey();
}
}
public interface IController
{
void Execute();
}
public abstract class ControllerBase : IController
{
// ,
public virtual void Execute()
{
Console.WriteLine("doing some unimporting things");
ExecuteCore();
}
//
public abstract void ExecuteCore();
}
public abstract class Controller : ControllerBase
{
public override void ExecuteCore()
{
Console.WriteLine("doing some importing things");
}
//public override void Execute()
//{
// Console.WriteLine("doing the whole things");
//}
}
public class HomeController : Controller
{
}