gam*_*gul 6 .net c# c++ inheritance access-modifiers
在C++中,您可以执行以下操作:
class base_class
{
public:
virtual void do_something() = 0;
};
class derived_class : public base_class
{
private:
virtual void do_something()
{
std::cout << "do_something() called";
}
};
Run Code Online (Sandbox Code Playgroud)
该derived_class覆盖的方法do_something(),并使得它private.结果是,调用此方法的唯一方法是这样的:
base_class *object = new derived_class();
object->do_something();
Run Code Online (Sandbox Code Playgroud)
如果将对象声明为类型derived_class,则无法调用该方法,因为它是私有的:
derived_class *object = new derived_class();
object->do_something();
// --> error C2248: '::derived_class::do_something' : cannot access private member declared in class '::derived_class'
Run Code Online (Sandbox Code Playgroud)
我认为这很好,因为如果你创建一个用作接口的抽象类,你可以确保没有人意外地声明一个字段作为具体类型,但总是使用接口类.
由于在C#/.NET一般来说,你不能缩小从接入public到private重载的方法时,有没有办法在这里实现类似的效果?
Tho*_*rin 14
如果您明确实现了一个接口,这至少会鼓励人们在声明中使用接口类型.
interface IMyInterface
{
void MyMethod();
}
class MyImplementation : IMyInterface
{
void IMyInterface.MyMethod()
{
}
}
Run Code Online (Sandbox Code Playgroud)
在将实例转换为之后,只能看到MyMethod IMyInterface.如果声明使用接口类型,则后续使用中不需要转换.
关于显式接口实现的MSDN页面(感谢Luke,给我节省几秒钟^^)
IMyInterface instance = new MyImplementation();
instance.MyMethod();
MyImplementation instance2 = new MyImplementation();
instance2.MyMethod(); // Won't compile with an explicit implementation
((IMyInterface)instance2).MyMethod();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2100 次 |
| 最近记录: |