好的,让我们从上到下:
命名空间是代码的逻辑顺序。
现实世界的比喻是图书馆。图书馆包含所有书籍,但图书馆的某些部分专门用于特定领域是有意义的,例如关于物理的书籍(代码)
类是一个模型(几乎总是从现实世界的对象派生而来),它公开了函数和属性。类可以(并且应该)封装(隐藏)开发人员不希望其他开发人员能够访问的属性和功能。考虑:
public class Car{
public Car(){}//default constructor.
public Car(int tirecount){//this constructor allows initialisation of the class to some 'safe' state
Tires = new Tire[tirecount];
}
//properties
public Tire[] Tires{get;set}//bad. at any point you can remove a tire from the car
public bool IsStopped{get;private set;}//safe. can check if car is stoppped outside class but can only change value inside car
//functions (...methods)
public Start(){//starts car
IsStopped = false;
}
public Stop(){
IsStopped = true;
}
public RemoveTire(int tireIndex)
{
if(!this.IsStopped)this.Stop();
Tires[tireIndex].Remove();//safe to remove tire when stopped
}
}
为了获得代码重用和多态行为,您必须阅读有关接口的信息。接口允许定义合约。合约的内部实现可以改变,但已经定义的方法不能在不破坏依赖于该合约的原始代码的情况下进行更改。可以在不破坏旧实现的情况下添加额外的协议。示例:
Class Man 实现 ITalk
类 Dog 实现 ITalk
ITalk 合同规定“我有“说话”功能,即
interface ITalk{
void Speak();
}
class World
{
List<ITalk> beings;
public World(List<ITalk> beingsToPopulateWorldWith)
{
beings = beingsToPopulateWorldWith;
}
public void MakeAllAnimalsTalk()
{
foreach(var b in beings)b.Speak();//because we know all object in the beings list use the ITalk interface (contract) we KNOW that we can call .Speak(). What each ITalk does in speak is up to them but we know we can call it.
}
}
所以 Man.Speak() 可能会输出“Hi”,而 Dog.Speak() 可能会输出“Woof”。
类也可以扩展,因此请考虑 Man/Dog 示例。它们的基类可能是 Animal。动物定义了 IsAlive。 Man 源自 Animal,因此与 Dog 一样获得 IsAlive,但是 Man 然后可以定义替代行为,即 AbilityToMakeTools 而不是狗。
我发现,一旦您开始将类设想为现实世界的对象/过程(一切都可以建模,甚至是最抽象的“事物”),那么类就开始具有逻辑意义。
HTH