program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils,
Unit1 in 'Pas\Unit1.pas';
var
p:Person;
begin
p:= Person.Create;//抽象方法一样可以实例化,但是会出现警告语句
p.setName('Delphi作者');
p.setAge(0);
p.setSex('变态');
p.speak;
p.Destroy;//一般使用Free,Free方法对P进行判断,如果不为nil,那么就Destroy;
Readln;
end.
{
1. 接口和类的不同
(1)接口中只有方法、属性,没有字段。所以接口中的属性存取都必须通过方法。
(2)接口中的方法只有声明,没有实现。实现在类中完成。
(3)接口中的方法没有作用域。都是公开的,但是在类中则放到不同作用域。
(4)接口中的方法没有修饰字。可以认为它们都是抽象的。
(5)不能创建接口实例,要使用接口,必须在类中实现,通过类调用接口的方法。
(6)在类中必须声明和实现接口的所有方法。不像类继承中可以选择。
(7)接口中的方法在类中实现时,可以加virtual/dynamic、abstract修饰,从而在子类中可以实现覆盖。
{
类从TObject继承,接口从IUnknown继承(= =! 接口也有祖先)。
}
//ChildInterface = interface(ParentInterface)
//['{GUID}']
//{方法列表}
//end;
//其中的['{GUID}'](Globally Unique Identifier,全球惟一标示)称为接口标示。
//COM类等可以有GUID标示。这样我们可以通过GUID得到对应的接口或者COM类(实例)。
//接口标示不是必须的。在IDE环境中,按Ctrl+Shift+G键可以产生GUID,也可以调用API函数CoCreateGuid得到
//。如果父接口定义了标示而它的子接口没有定义,该标示不会继承到子接口,此时子接口被认为没有标示。
//Delphi的SysUtils单元提供了GUID和String之间的转换函数StringToGUID、GUIDToString。
// }
//摘自:http://blog.csdn.net/jiangwzh/article/details/7407086
unit Unit1;
{
public :派生类可以直接访问基类中的public数据
private:基类中的private不允许在派生类中访问,但是也有例外,
若基类和子类在同一个单元文件中,则可以访问,
若不在同一个单元文件则不能访问
protected:基类中的protected在子类中成为private
}
interface
type
Person=class(TObject) //继承的用法(父类)
private
name:string;
age:Integer;
sex:string;
public
constructor create(name:string;age:Integer);overload; //若定义两个构造函数,或者重载一个同名函数,需要使用overLoad,
//如果子类需要覆写父类中的方法,则方法需要被virsual修饰
//而子类中需要使用override修饰该方法或者过程
constructor create(name:string;age:Integer;sex:string);overload; //构造函数
procedure setName(name:string);
function getName:string;
procedure setAge(age:Integer);
function getAge:Integer;
procedure setSex(sex:string);
function getSex:string;
procedure speak;
procedure run();virtual;abstract; //定义抽象方法,在实现区域不能实现该抽象方法,必须由子类实现,不能在实现部分出现该过程的声明
//destructor Destroy;overload; //析构函数
end;
implementation
constructor person.create(name:string;age:Integer);
begin
Self.name:=name;
Self.age:=age;
end;
constructor person.create(name:string;age:Integer;sex:string);
begin
Self.name:=name;
Self.age:=age;
Self.sex:=sex;
end;
procedure Person.setName(name:string);
begin
Self.name:=name;
end;
function Person.getName:string;
begin
Result:= Self.name;
end;
procedure Person. setAge(age:Integer);
begin
Self.age:=age;
end;
function Person.getAge:Integer;
begin
Result:=Self.age;
end;
procedure Person.setSex(sex:string);
begin
Self.sex:=sex;
end;
function Person.getSex:string;
begin
Result:=Self.sex;
end;
procedure person.speak;
begin
Writeln('写的真慢');
end;
{ destructor Person.Destroy;overload;
begin
inherited Destroy;
end; }
end.