本篇文章给大家谈谈声明类实现接口,以及接口声明有哪两种对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
今天给各位分享声明类实现接口的知识,其中也会对接口声明有哪两种进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
请教MFC如何声明实现接口
在InternetExpress中支持一些有别于VCL TComponent控件
声明类实现接口的控件,如QueryForm等,它们都能生成html代码以在浏览器中显示自己,这些控件主要的不同之处在于它们都是接口。
本文的目标就是展示如何自己编写可在DataForm或QueryForm里使用的InternetExpress自制控件。在开始之前最重要的是搞清楚MidItems单元。它包含有TWebForm构件的定义,它是所有InternetExpress-aware构件的起点。从它衍生出两个类
声明类实现接口:TDataForm和TQueryForm。实际上TQueryForm是从TCustomQueryForm继承来的,TCustomQueryForm是TWebForm的子类并且实现了IQueryForm接口。IQueryForm是一个没有方法的接口,也许偶尔可以用来在运行时区分DataForm和QuyeryForm(不然实在没办法解释为什么会在首要位置使用一个空的接口)。
实际的子构件也可以在MidItems单元时里找到,包括TFieldText、TTextColumn和TQueryText。它们的祖先类是TWebTextInput,也
声明类实现接口我们自制InternetExpress控件的基类,TWebTextInput拥有许多我们应该重载或实现的有趣的方法。最有趣的方法是ControlContents和AddAtrributes,它们是用来生成代表控件的HTML代码。正是它们使得RadioButton成其为无线钮、CheckBox成其为检查框。//后面会讲到,已经用过InternetExpress和页面编辑器的程序员可能注意到了:我们有几乎每一种HTML控制可用,除了Check box。我也觉得很奇怪,不过也没什么关系。
Latest News: John Kaster of Borland DevRel told me the reason they didn't implement checkbox support (yet). The state of the checkbox when off is indeterminate -- no value is passed back UNLESS the checkbox is turned on.
Borland hasn't found a solution they like, yet, and you'll be facing the same problem with my component. We're still working on that, so stay tuned...
TWebTextInput AddAttributes方法定义如下:
procedure TWebTextInput.AddAttributes(var Attrs:string);
begin
AddQuotedAttrib(Attrs,'NAME',GetHTMLControlName);
AddIntAttrib(Attrs,'SIZE',DisplayWidth);
AddIntAttrib(Attrs,'TABINDEX',TabIndex);
AddQuotedAttrib(Attrs,'STYLE',Style);
AddQuotedAttrib(Atrtrs,'CLASS',StyleRule);
AddCustomAttrib(Attrs,Custom);
end;
先不管AddQuotesAttrib和AttIntAttrib等方法,相信你能够接受AddAttributes方法输出HTML控制名字(a lookup function)、DisplayWidth、TabIndex,Style和StyleRule到一个字符串Attrs里了。ControlContents方法则使用该字符串生成我们需要的完整的HTML代码。要加入特定的HTML型控件,需要重载ControlContent方法,并使用Attrs作为上面的AddAttributes方法的返回值。
TWebCheckBox
要制作我们的简单的WebCheckBox控件,需要从TWebTextInput派生一个类,并重载ControlContents方法,新类的定义及实现如下:
type
TWebCheckbox=class(TWebTextInput)
protected
function ControlContent(Opetions:TWebContentOptions):string:override;
published
property DisplayWidth;
property ReadOnly;
property Caption
property CaptionAttributes;
property CaptionPosition;
property TabIndex;
property Style;
property Cutsom;
property StyleRule;
end;
impleamentation
function TWebCheckbox.ControlContent(Opetions:TWebContentOptions):string;
var
Attrs:string;
begin
AddAttributes(Attrs);
Result:=Format('<INPUT TYPE=CHECKBOX %0:s',[Attrs]);
end;
就这么简单,等会我们注册这个控件之后(方式见本文最后),就可以在Web Page Editor里看到它了,所以现在就可以在我们的InternetExpress应用程序里使用了。然而,这个控件只能作为DataForm的子对象,要想能作为QueryForm的子对象显示,还得做些特别的事情:
TQueryCheckBox
要让一个InternetExpress控件与QueryForm配合工作,需要加入一个接口定义并实现之(新鲜,不实现加它干嘛)。我们从前面的TWebCheckBox派生一个新的TQueryCheckBox,并实现IQueryField接口以形成一个新的可加到QueryForm里的InternetExpress自制控件。在动手之前,先看一眼IQueryField接口,如下:
type
IQueryField=interface(IHTMLField)
['{7C3211150-FCFB-11D2-AFC3-00C04FB16EC3}']
funtcion GetParamName:string;
procedure SetParamName(AParamName:string);
function GetText:string;
procedure SetText(const Value:string);
property ParamName:string read GetParamName write SetParamName;
property Text:string read GEtTExt write SetText;
end;
这意味着任何实现了IQueryField接口的类都得实现接口里定义的方法。咱们的TQueryCheckBox类的定义和实现如下(注意,咱们只实现了GetText/SetText方法,没有实现ParamName方法):
type
TQueryCheckbox=class(TWebCheckbox,IQueryField)
private
FText:string;
protected
function GetText:string;
procedure SetText(const VAlue:string);
public
class function IsQueryField:Boolean;voerride;
end;
implementation
class function TQeryCheckbox.IsQueryField:boolean;
begin
Result:=True;
end;
funciton TQueryCheckbox.GetText:string;
begin
Result :=FText;
end;
procedure TQueryCheckbox.SetText(const Value:string);
begin
FText:=Value;
end;
做为IQueryField接口的一部份,类方法IsQueryField确保任何构件可以"introspect" TQueryCheckBox构件,显然,它只对QueryForms有意义。(introspect,内省,意即构件通过在此回答“你是QueryField吗
声明类实现接口?”,上面的例子回答“是的”,已经表明心迹,QueryForm可以相信其是Query家族的成员,可以做为自己的子对象。呵呵,什么时候girl们实现这么一个方法就好了)。
Registration
最后一个任务,比起实现这些控件要复杂一些,是注册这些控件。由于我们处理的不是常规出现于控件面板的控件,需要用一个不同的方法进行注册也就不足为奇了。这回得用RegisterWebComponents过程,它接受一个InternetExpress控件数组及一个可选的(控件)编辑器参数。我们只需要做个简单的调用:
procedure Register
begin
RegisterWebComponets([TWebCheckBox,TQueryCheckBox]);
end;
让一个类实现一个接口
1、抽象类里面可以有非抽象方法但接口里只能有抽象方法 声明方法的存在而不去实现它的类被叫做抽像类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽像类,并让它指向具体子类的一个实例。不能有抽像构造函数或抽像静态方法。Abstract 类的子类为它们父类中的所有抽像方法提供实现,否则它们也是抽像类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。2、接口(interface)是抽像类的变体。在接口中,所有方法都是抽像的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽像的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对像上调用接口的方法。由于有抽像类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口
类声明 类实现分别是啥意思?
类的声明:就是包含了具体的成员变量还有方法。
类的声明(一般叫类的前向声明) :不是一个完整的类,现在还不能实例化对象只能用于定义指向该类的指针和引用作为函数的形参或者返回值。
类的声明:
class Ha
{
public:
Ha() {}; //构造函数
virtual ~Ha(){}; //析构函数
void show() {cout << "Hi C" << endl;}
};
类的声明:
class Ha; //声明一个还未定义的类供其他函数或者类的方法用作形参或者返回值 但是在这个类未定义前不能创建一个Ha对象更不能直接引用类中的某个成员。
class Wa
{
public:
Wa(){};
virtual ~Wa(){};
Ha VisitHa (Ha ha);
/*{
// 注意**现在在VisitHa函数体中访问未定义的ha成员是不允许的 应该放在Ha定义的后面 所以我在这里把它的函数体注释了起来
ha.show();
return ha;
}*/
};
声明一个接口,此接口至少具有一个方法,在一个方法中声明内部类实现此接口,并返回此接口的引用
自己多动动脑筋查查资料,这些问题不是做不来,是不想做的原因
public interface Fruit {
void bad();
void good();
}
public class MyFruit{
public Fruit myapple() {
class state implements Fruit {
@Override
public void bad() {
System.out.println("myapple is bad!");
}
@Override
public void good() {
System.out.println("myapple is good!");
}
}
return new state();
}
public static void main(String[] args) {
MyFruit myFruit = new MyFruit();
Fruit fruit = myFruit.myapple();
fruit.bad();
fruit.good();
}
}
Java中 一个类实现了某接口 则必须实现该接口中的所有方法么?
不一定
声明类实现接口,关键要看子类是否是抽象类。
如果子类是非抽象类,则必须实现接口中
声明类实现接口的所有方法
声明类实现接口;
如果子类是抽象类,则可以不实现接口中
声明类实现接口的所有方法,因为抽象类中允许有抽象方法
声明类实现接口的存在!
1、抽象类定义
抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。通常在编程语句中用 abstract 修饰的类是抽象类。在C++中,含有纯虚拟函数的类称为抽象类,它不能生成对象;在java中,含有抽象方法的类称为抽象类,同样不能生成对象。抽象类是不完整的,它只能用作基类。在面向对象方法中,抽象类主要用来进行类型隐藏和充当全局变量的角色。
2、抽象类特点
1)抽象类不能实例化。
2)抽象类可以包含抽象方法和抽象访问器。
3)不能用 sealed 修饰符修饰抽象类,因为这两个修饰符的含义是相反的。 采用 sealed 修饰符的类无法继承,而 abstract 修饰符要求对类进行继承。
4)从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实际实现。
3、与具体类的比较
1)抽象类不能直接实例化,并且对抽象类使用 new 运算符会导致编译时错误。虽然一些变量和值在编译时的类型可以是抽象的,但是这样的变量和值必须或者为 null,或者含有对非抽象类的实例的引用(此非抽象类是从抽象类派生的)。
2)允许(但不要求)抽象类包含抽象成员。
3)抽象类不能被密封。
4、与接口的比较
1)相同点
a、不能实例化;
b、包含未实现的方法声明;
c、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员)
2)不同点
a、类可以实现无限个接口,但仅能从一个抽象(或任何其他类型)类继承,从抽象类派生的类仍可实现接口,从而得出接口是用来解决多重继承问题的。
b、抽象类当中可以存在非抽象的方法,可接口不能,且它里面的方法只是一个声明必须用public来修饰没有具体实现的方法。
c、抽象类中的成员变量可以被不同的修饰符来修饰,可接口中的成员变量默认的都是静态常量(static final)。
d、抽象类是对象的抽象,然而接口是一种行为规范。
关于声明类实现接口和接口声明有哪两种的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
声明类实现接口的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于接口声明有哪两种、声明类实现接口的信息别忘了在本站进行查找喔。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
暂时没有评论,来抢沙发吧~