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

C# 关于接口、抽象类和具体类的面向对象问题,c#,java,oop,abstract-class,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 m

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)如果我在接口中将OnCreate方法设置为受保护

interface InterFace {
    protected void OnCreate();
}   
我得到的错误如下:
接口方法OnCreate的非法修饰符;仅允许公开和摘要

3)如果我在实现如下接口的ClsFirst类中设置了受保护的方法:

interface InterFace {
    void OnCreate();
}   

class ClsFirst implements InterFace {
    @Override
    protected void OnCreate() { }

}
我得到了这个错误:
无法降低从接口继承的方法的可见性

4)当我将ClsFirst更改为抽象类并实现接口时

interface InterFace {
    void OnCreate();
}   

abstract class ClsFirst implements InterFace {

}
我没有在ClsFirst类中实现OnCreate方法,但是clslat为什么

摘要

  • 如何设置只能在派生类中使用的接口方法
  • 为什么我不能在接口内设置具有受保护访问权限的方法
  • 为什么在实现接口后不能将类的访问器类型设置为与public不同
  • 抽象类,即使它们实现了一个接口,也不必添加未实现的方法本身,直到一个类派生出抽象类。为什么?

  • 非常感谢您从现在起的友好回答。

    接口方法始终是公开的。您不能缩小这些方法的范围。在抽象类中使用受保护的抽象方法

    接口方法始终是公共的。您不能缩小这些方法的范围。在抽象类中使用受保护的抽象方法

    实际上,您可以隐藏该方法,直到通过显式实现接口将您的具体类转换为“接口”实例:

    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. 
    

    实际上,您可以隐藏该方法,直到通过显式实现接口将您的具体类转换为“接口”实例:

    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. 
    
  • 你不能这样做。如果您有一个只实现接口契约中定义的一部分的中间类,则可以将方法设置为虚拟或抽象

  • 您也不能这样做,原因很简单,接口定义了一个契约,一组要求实现的操作。您可以在抽象类中显式地实现接口,或者将整个接口限制为“内部”,至少在c#中是这样,以防您希望将其保持在“内部”

  • 您不能这样做,因为您承诺要实现一个接口

  • 因为在将类标记为抽象之后,您间接指出的另一件事是,您不能实例化它。因此,您将实现接口的需求传递给第一个类,您可以创建该类的实例(我指的是继承链)

  • ad1。(例1)

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

  • 您也不能这样做,原因很简单,接口定义了一个契约,一组要求实现的操作。您可以在抽象类中显式地实现接口,或者将整个接口限制为“内部”,至少在c#中是这样,以防您希望将其保持在“内部”

  • 您不能这样做,因为您承诺要实现一个接口

  • 因为在将类标记为抽象之后,您间接指出的另一件事是,您不能实例化它。因此,您将实现接口的需求传递给第一个类,您可以创建该类的实例(我指的是继承链)

  • ad1。(例1)

    1) 首先,为什么要实现受保护的
    接口
    ?它不会增加任何价值。您已经有了确保所有派生类符合给定约定的方法:

     protected abstract void OnCreate();
    
    2) 接口定义了一个
    公共
    合同。通过
    public
    我的意思是,它与接口本身具有相同的可访问性。这就是为什么在定义
    接口
    成员时不允许使用可访问性修饰符的原因

    3) 您不能降低任何虚拟成员或接口成员的可访问性,因为这样会破坏接口的约定。在您的示例中,
    ((IOnCreate)ClsFirst).OnCreate()
    不可能,因为
    OnCreate()
    不可访问,这意味着
    ClsFirst
    不实现
    IOnCreate
    接口。

    1)为什么要首先实现受保护的
    接口?它不会增加任何价值。您已经有了确保所有派生类符合给定约定的方法:

     protected abstract void OnCreate();
    
    2) 接口定义了一个
    公共
    合同。通过
    public
    我的意思是,它与接口本身具有相同的可访问性。这就是为什么在定义
    接口
    成员时不允许使用可访问性修饰符的原因


    3) 您不能降低任何虚拟成员或接口成员的可访问性,因为这样会破坏接口的约定。在您的示例中,
    ((IOnCreate)ClsFirst).OnCreate()
    不可能,因为
    OnCreate()
    不可访问,这意味着
    ClsFirst
    不实现
    IOnCreate
    接口。

    接口
    根据定义是公共合同。通过实现一个接口,您承诺提供一组方法(以及其他语言的属性)

    接口与
    抽象类没有任何共同之处,因为您可以在单个类上实现所需的任意多个接口,并且您可以
    实现
    ,而不是从中派生

    抽象类是一个基类,它类似于一个部分功能的基类,用于在不同的