1) OnCreate是ClsLast类中实例化对象的公共方法。 但我想将OnCreate方法限制为受保护的。
interface InterFace {
void OnCreate();
}
class ClsFirst implements InterFace {
@Override
public void OnCreate() { }
}
class ClsLast extends ClsFirst{ }
class Test {
static void main(){
ClsLast objClsAct = new ClsLast();
objClsAct.OnCreate();
}
}
2)如果我在InterFace中将OnCreate方法设置为受保护
interface InterFace {
protected void OnCreate();
}
我收到的错误是这样的:
Illegal modifier for the interface method OnCreate; only public & abstract are permitted
3)如果我在ClsFirst类中设置了保护方法,该方法实现了InterFace,如下所示:
interface InterFace {
void OnCreate();
}
class ClsFirst implements InterFace {
@Override
protected void OnCreate() { }
}
我收到此错误:
Cannot reduce the visibility of the inherited method from InterFace
4)当我将ClsFirst更改为抽象类并实现InterFace时
interface InterFace {
void OnCreate();
}
abstract class ClsFirst implements InterFace {
}
我没有在ClsFirst类中实现OnCreate方法,而是ClsLast为什么?
摘要
非常感谢你从现在开始的答案。
答案 0 :(得分:2)
接口方法总是公开的。您无法减少这些方法的范围。在抽象类中使用受保护的抽象方法。
答案 1 :(得分:2)
interface
按定义为public contract
。通过实现接口,您承诺提供一组方法(以及其他语言的属性)。
接口与abstract
类没有任何共同之处,因为您可以在单个类上实现任意数量的接口,并且implement
而不是derive
。
abstract class
是一个基类,它就像一个部分功能基础,用于在不同类之间共享实现细节并提供合同。但是,它更像是所有派生类的内部合同。大多数情况下,抽象类用于强制所有派生类成为共同模式,而不是共享公共契约。
抽象类可以强制派生类实现方法(或使用virtual
关键字提供合适的默认实现)并使用此方法(这称为Template Pattern)。
如果在抽象类上实现接口,则不必提供所有接口方法,因为无法实例化抽象类。但是,如果未实现所有接口方法,则层次结构中的第一个非抽象类必须提供缺少的方法。
答案 2 :(得分:1)
你不能这样做。如果您的中间类只实现接口契约中定义的一部分,则可以将方法设置为虚拟或抽象。
你也做不到,原因很简单,接口定义了一个契约,一组要求实现的操作。您可以在抽象类中显式实现接口,或者将整个接口限制为“内部”,至少在c#中,如果您希望将其保留在“内部”中。
你不能这样做,因为你答应实现一个接口。
因为您将类标记为抽象时间接指向的另一件事是您无法实例化它。因此,您将实现接口的要求传递给您可以创建实例的第一个类(我的意思是继承链)。
AD1。 (c#example1)
interface IDummyInterface
{
void OnCreate();
void Process();
void OnFinish();
}
abstract class DummyAbstract : IDummyInterface
{
public virtual void OnCreate()
{
}
public abstract void Process();
public void OnFinish()
{
OnFinishInternal();
}
protected abstract void OnFinishInternal();
}
class DummyImplementor : DummyAbstract
{
public override void OnCreate()
{
// some other action here
base.OnCreate();
}
public override void Process()
{
}
protected override void OnFinishInternal()
{
}
}
答案 3 :(得分:0)
实际上你可以隐藏方法,直到通过明确地实现接口将具体类转换为“接口”实例:
abstract class ClsFirst : Interface
{
void Interface.OnCreate()
{
this.OnCreate();
}
protected abstract void OnCreate();
}
ClsFirst last = new ClsLast();
last.OnCreate(); // Compiler Error, since OnCreate() is protected
Interface lastAsInterface = last;
lastAsInterface.OnCreate(); // Works, and calls the abstract OnCreate() method.
答案 4 :(得分:0)
1)为什么要开始实施受保护的interface
?它不会增加任何价值。您已经有办法确保所有派生类都符合给定的合同:
protected abstract void OnCreate();
2)接口定义public
合约。到public
我的意思是它具有与界面itselft相同的可访问性。这就是定义interface
成员时不允许使用可访问性修饰符的原因。
3)您不能减少任何虚拟成员或接口成员的可访问性,因为您将破坏接口的合同。在您的示例中,((IOnCreate)ClsFirst).OnCreate()
无法访问,因为OnCreate()
无法访问,这意味着ClsFirst
未实现IOnCreate
接口。