我有一个带有一些受保护成员的抽象基类,但没有抽象成员:
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
。
接口不是一个选项,因为我希望它保持内部,而不是公共, 而且我不希望实例化基类,所以我认为抽象将是一个不错的选择..
答案 0 :(得分:0)
private BaseClass child;
public bool DomeSomethingSpecific(int i)
{
var c = {initialization to an instance - e.g. Child1(), Child2(), Child3()..};
if (c is Child1){
((Child1)c).DomeSomethingSpecificForChild1(i);
}
}
答案 1 :(得分:0)
您可能想要使用抽象方法:
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)
{
}
public abstract bool DoSomethingSpecific(int i);
}
然后
internal sealed class Child1:BaseClass
{
internal Child1(string var1, string var2)
: base(var1, var2)
{
}
public override bool DomeSomethingSpecific(int i)
{
}
}
答案 2 :(得分:0)
将子类对象强制转换为基类
public class MyClass
{
public bool DomeSomethingSpecific(int i)
{
var child1 = new Child1("a","b");
((myBaseClass)child1).DomeSomethingSpecificForChild1(i);
}
}
答案 3 :(得分:0)
显然,您将变量声明为基类实例,您只能使用基类公开的方法。
要使用特定的类方法,您需要转换对象,所以:
if(child is Child1)
{
Child1 c1 = child as Child1
if(c1 != null) c1.specificMethod1();
}
if(child is Child2)
{
Child2 c2 = child as Child2
if(c2 != null) c2.specificMethod2();
}
// ...