隐藏继承 C#
Hidden Inherritance c#
在c#中,是否可以阻止程序员继承parent class,但允许继承child classes(也许只是在代码的编写,而不是在运行时)?
例如:
//Class which should only allow 'RangedAbility' and 'MeleeAbility' to inherit.
//No other classes are to be allowed to inherit from Ability
public abstract class Ability{
public virtual void foo(){}
}
public class RangedAbility : Ability{
//an empty class
}
public class MeleeAbility : Ability{
//an empty class
}
public class myAbility : MeleeAbility{
public override void foo(){ /*some code*/}
}
//attempting to inherit from `Ability` instead of `MeleeAbility` or instead of 'RangedAbility'
//should result in programmer facing an error in IDE such as Visual Studio.
在Ability
上使用"sealed"是行不通的(它是抽象的,RangedAbility
、MeleeAbility
需要继承它)。
这两个 child class 继承 "simmulate" 的方法将非常乏味,必须在 MeleeAbility
和 RangedAbility
中完成。
完全放弃 Ability
的使用,并强制 RangedAbility
和 MeleeAbility
实现接口似乎也不是一个好的选择,因为它们共享 better-off 的方法通过"hidden"parentclass.
写了一次
做这样的代码的原因是我需要在运行时确定从 'myAbility' 类型期望什么样的行为。它是通过 IsSubclassOf(typeof(MeleeAbility))
或 IsSubclassOf(typeof(RangedAbility))
完成的,它允许确定预期行为 而无需 需要 myAbility
.
的实际实例
public abstract class Ability
{
internal Ability()
{
}
public virtual void foo(){}
}
因为 Ability
的唯一构造函数是 internal
,所以只能构造来自同一程序集的派生 class(未显式构建在基础构造函数上的构造函数是隐式 : base()
)。任何试图在另一个程序集中直接从 Ability
派生的 class 都没有有效的构造函数。
(在相关说明中,您可能会发现一个内部摘要 属性,您自己的 class 会覆盖到 return 不同的值,作为确定您拥有的比执行的更简洁的方法显式 IsSubClassOf
甚至 is
测试。或者更好的是,通过内部抽象方法提供打开此类测试的任何功能)。
在c#中,是否可以阻止程序员继承parent class,但允许继承child classes(也许只是在代码的编写,而不是在运行时)?
例如:
//Class which should only allow 'RangedAbility' and 'MeleeAbility' to inherit.
//No other classes are to be allowed to inherit from Ability
public abstract class Ability{
public virtual void foo(){}
}
public class RangedAbility : Ability{
//an empty class
}
public class MeleeAbility : Ability{
//an empty class
}
public class myAbility : MeleeAbility{
public override void foo(){ /*some code*/}
}
//attempting to inherit from `Ability` instead of `MeleeAbility` or instead of 'RangedAbility'
//should result in programmer facing an error in IDE such as Visual Studio.
在Ability
上使用"sealed"是行不通的(它是抽象的,RangedAbility
、MeleeAbility
需要继承它)。
MeleeAbility
和 RangedAbility
中完成。
完全放弃 Ability
的使用,并强制 RangedAbility
和 MeleeAbility
实现接口似乎也不是一个好的选择,因为它们共享 better-off 的方法通过"hidden"parentclass.
做这样的代码的原因是我需要在运行时确定从 'myAbility' 类型期望什么样的行为。它是通过 IsSubclassOf(typeof(MeleeAbility))
或 IsSubclassOf(typeof(RangedAbility))
完成的,它允许确定预期行为 而无需 需要 myAbility
.
public abstract class Ability
{
internal Ability()
{
}
public virtual void foo(){}
}
因为 Ability
的唯一构造函数是 internal
,所以只能构造来自同一程序集的派生 class(未显式构建在基础构造函数上的构造函数是隐式 : base()
)。任何试图在另一个程序集中直接从 Ability
派生的 class 都没有有效的构造函数。
(在相关说明中,您可能会发现一个内部摘要 属性,您自己的 class 会覆盖到 return 不同的值,作为确定您拥有的比执行的更简洁的方法显式 IsSubClassOf
甚至 is
测试。或者更好的是,通过内部抽象方法提供打开此类测试的任何功能)。