面向对象的关于接口,抽象类和具体类的问题

时间:2011-07-03 10:27:16

标签: c# java oop abstract-class

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为什么?

摘要

  1. 如何设置接口方法只能在派生类中使用?
  2. 为什么我不能在Interface中设置具有受保护访问权限的方法?
  3. 为什么在实现InterFace后,我不能将Class的访问者类型设置为不同于公共?
  4. 抽象类,即使它们实现了接口,也不必在一个类派生抽象类之前自己添加未实现的方法。为什么?
  5. 非常感谢你从现在开始的答案。

5 个答案:

答案 0 :(得分:2)

接口方法总是公开的。您无法减少这些方法的范围。在抽象类中使用受保护的抽象方法。

答案 1 :(得分:2)

interface按定义为public contract。通过实现接口,您承诺提供一组方法(以及其他语言的属性)。

接口与abstract类没有任何共同之处,因为您可以在单个类上实现任意数量的接口,并且implement而不是derive

abstract class是一个基类,它就像一个部分功能基础,用于在不同类之间共享实现细节并提供合同。但是,它更像是所有派生类的内部合同。大多数情况下,抽象类用于强制所有派生类成为共同模式,而不是共享公共契约。

抽象类可以强制派生类实现方法(或使用virtual关键字提供合适的默认实现)并使用此方法(这称为Template Pattern)。

如果在抽象类上实现接口,则不必提供所有接口方法,因为无法实例化抽象类。但是,如果未实现所有接口方法,则层次结构中的第一个非抽象类必须提供缺少的方法。

答案 2 :(得分:1)

  1. 你不能这样做。如果您的中间类只实现接口契约中定义的一部分,则可以将方法设置为虚拟或抽象。

  2. 你也做不到,原因很简单,接口定义了一个契约,一组要求实现的操作。您可以在抽象类中显式实现接口,或者将整个接口限制为“内部”,至少在c#中,如果您希望将其保留在“内部”中。

  3. 你不能这样做,因为你答应实现一个接口。

  4. 因为您将类标记为抽象时间接指向的另一件事是您无法实例化它。因此,您将实现接口的要求传递给您可以创建实例的第一个类(我的意思是继承链)。

  5. 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接口。