【发布时间】:2012-06-21 09:30:37
【问题描述】:
我有一个带有一些受保护成员的抽象基类,但没有抽象成员:
internal abstract class BaseClass
{
protected readonly string Var1;
protected readonly string Var2;
protected BaseClass(string var1, string var2)
{
Var1 = var1;
Var2 = var2;
}
protected int DoSomething1(string s)
{
}
}
还有一些类实现了这个基类,并且每个类都有一些不同的特定方法:
internal sealed class Child1:BaseClass
{
internal Child1(string var1, string var2)
: base(var1, var2)
{
}
internal bool DomeSomethingSpecificForChild1(int i)
{
}
}
现在我有另一个类,我想有一个BaseClass 类型的变量,并根据我的需要,用一个子类型来实例化它。
但这不起作用,因为具体方法未知。
public class MyClass
{
private BaseClass myBaseClass;
public bool DomeSomethingSpecific(int i)
{
myBaseClass = new Child1("a","b");
myBaseClass.DomeSomethingSpecificForChild1(i);
}
}
有什么方法可以实现我想要的吗?
还是我必须在MyClass 方法的内部范围内声明我的变量?
public class MyClass
{
private BaseClass myBaseClass;
public bool DomeSomethingSpecific(int i)
{
var child1 = new Child1("a","b");
myBaseClass.DomeSomethingSpecificForChild1(i);
}
}
但是这样我不确定该类是否实现了BaseClass。
接口不是一个选项,因为我希望它保持内部,而不是公开, 而且我不希望基类被实例化,所以我认为抽象在这里是一个不错的选择..
【问题讨论】:
-
您的代码不会按原样运行,您必须在子类中标记要覆盖的函数 virtual,在子类中定义函数时还需要使用“override”关键字
-
@MSUH 我知道,但问题是我不想覆盖任何方法。我已经将每个类的相同方法作为基类中的受保护方法。在 childclass 中,我可以放任何我喜欢的东西。我只是想确保我在“MyClass”中实例化的类确实实现了“BaseClass”。
-
那你需要检查 if (child1 is BaseClass){child1.DomeSomethingSpecificForChild1(1);}
-
恐怕你是对的。也许我必须寻找不同的设置,因为这不是我想要的......无论如何,谢谢。
标签: c# abstract-class