C# 在多态性中访问函数

C# 在多态性中访问函数,c#,polymorphism,C#,Polymorphism,有3个等级A、B、C。类B和C继承自A。 类B和C有一个函数-func1(),而a没有。 我有一个列表OB,其中每个对象都是B或C。 我想通过OB[0]访问func1。func1()。 我该怎么做? 谢谢大家! 您试图调用类A上的方法func1,其中A没有定义它?你不能。如果需要,可以在A中进行Func1抽象 abstract class A { public abstract Func1(); } class B : A { public override Func1()

有3个等级A、B、C。类B和C继承自A。 类B和C有一个函数-func1(),而a没有。 我有一个
列表OB
,其中每个对象都是B或C。 我想通过
OB[0]访问func1。func1()
。 我该怎么做?
谢谢大家!

您试图调用类
A
上的方法
func1
,其中
A
没有定义它?你不能。如果需要,可以在
A
中进行
Func1
抽象

abstract class A 
{
    public abstract Func1();
}

class B : A
{
    public override Func1()
    {
        MessageBox.Show("Hello World");
    }
}

class C : A
{
    public override Func1()
    {
        MessageBox.Show("Goodbye World");
    }
}
Func1
是抽象的,这意味着不能直接实例化
A
,但可以实例化
B

var listOfA = new List<A>();

listOfA.Add(new B());
listOfA.Add(new C());

listOfA[0].Func1(); // hello world
listOfA[1].Func1(); // goodbye world

var listOfA=新列表设计气味。

将该方法作为虚拟方法添加到类A中,并使B和C覆盖它:

public class A
{
    public virtual void Foo()
    {

    }
}

public class B : A
{
    public override void Foo()
    {

    }
}

public class C : A
{
    public override void Foo()
    {

    }
}

如果放置func1()没有意义,或者无法更改类A,则可以创建一个具有func1()的接口,并让类B和C实现该接口。然后,当需要调用func1()时,使用as运算符将对象强制转换到该接口。使用as运算符时,如果强制转换失败,则不会引发异常

public interface MyInterface
{
    void func1();
}

public class B : MyInterface
{
    public func1() {...}
    ....
}

public class C : MyInterface
{
    public void func1() {...}
    ....
}

//example of calling func1()
List<A> list = new List<A>(stuff);
foreach(A item in list)
{
    MyInterface tmp = item as MyInterface;
    if(tmp != null)
    {
        tmp.func1();
    }
}
公共接口MyInterface
{
void func1();
}
公共类B:MyInterface
{
公共func1(){…}
....
}
公共类C:MyInterface
{
public void func1(){…}
....
}
//调用func1()的示例
列表=新列表(物料);
foreach(列表中的项目)
{
MyInterface tmp=项目作为MyInterface;
如果(tmp!=null)
{
tmp.func1();
}
}

抽象工厂做同样的事情,你正在寻找 我在电脑上找到了这个密码 这可能对你有帮助

//Let's define type of bread bases
public enum BreadBase
{
 HotIndianMasalaBase,
 PunjabiTadkaBase,
 ItalianCheeseBase,
 VeggieBase,
}
//This is a breadfactory where people visit to get their favorite bread bases
public interface BreadFactory
{
  Bread GetBread(BreadBase BreadBase);
}
 //The abstract bread
public interface Bread
{
   void Bake();
 }

//create concrete classes

 public class HotIndianMasalaBread :Bread
{
 public void Bake()
{ 
    Console.WriteLine ("For you::Hotindian Masala base Bread.");
}
}
public class VeggieBread : Bread
{
public void Bake()
{
    Console.WriteLine("For you::Veggie base Bread.");
}
}

 public class ItalianCheeseBread : Bread
{
public void Bake()
{
    Console.WriteLine("For you::Italian cheese base Bread.");
}
}
public class PunjabiTadkaBaseBread : Bread
{
 public void Bake()
{
    Console.WriteLine("For you::Punjabi tadka base bread.");
 }
}
//Lets create bread factories aka concrete classes

 public class AmericanBreadFactory :BreadFactory
 {
 public Bread GetBread(BreadBase BreadBase)
{
    Bread vBread = null;
    switch (BreadBase)
    {
        case BreadBase.VeggieBase:
            vBread = new VeggieBread();
            break;
        case BreadBase.ItalianCheeseBase:
            vBread = new ItalianCheeseBread();
            break;
    }
    return vBread;
  }
 } 

   public class IndianBreadFactory :BreadFactory
    {
 public Bread GetBread(BreadBase BreadBase)
{
    Bread vBread = null;
    switch (BreadBase)
    {
        case BreadBase.HotIndianMasalaBase:
            vBread = new HotIndianMasalaBread();
            break;
        case BreadBase.PunjabiTadkaBase:
            vBread = new PunjabiTadkaBaseBread();
            break;
    }
    return vBread;
   }
 }

//lets order breads

class Program
{
static void Main(string[] args)
{
//example of abstract factory
AmericanBreadFactory vAmericanBread = new AmericanBreadFactory();
Bread vBread = vAmericanBread.GetBread(BreadBase.VeggieBase);
vBread.Bake();

//lets bak indian punjabi tadka bread
IndianBreadFactory vIndianBreadFactory = new IndianBreadFactory();
Bread vIndianBread = vIndianBreadFactory.GetBread(BreadBase.PunjabiTadkaBase);
vIndianBread.Bake();
   }
 } 

如果不在
A
中定义该方法,或者不使用定义
func1
@user3371183的公共接口,您就无法做到这一点。您应该用您试图解决的问题更新问题,您可能会得到一个更相关的答案,以不同的方式解决您的问题。