-1

在 C# 中,使用抽象类时如何实例化一个单独的类?我正在尝试实例化 foo3。

意义:

abstract class foo
{
     public string myId {get;set;}
     public string mystring {get;set;}
     public foo3 my3rdFoo {get;set}
}

class foo2 : foo
{
     public string myFavoriteFoo {get;set;}
}

class foo3
{
     public string myName{get;set}         
}

成功创建新的 foo2 后......(我没有添加代码。)

我尝试使用以下代码调用 foo3:

((foo2)newDoc).foo3.myName = "blah...blah...";

但我不断收到一个空错误......这里......

4

5 回答 5

3

您必须首先实例化一个派生抽象类的类,在您的情况下 - foo2。然后,将一个新对象分配给要实例化的对象:

var myFoo2 = new foo2();
myFoo2.my3rdFoo = new foo3();

或使用对象实例化语法:

var myFoo2 = new foo2{
  my3rdFoo = new foo3()
};

或将 my3rdFoo 实例化添加到 foo2 构造函数:

public foo2(){
  my3rdFoo = new foo3();
}

您不能直接实例化抽象类。

只有在此之后,您才能为子类的属性赋值。此外,您应该以大写命名类 - 稍后将更容易区分。

于 2013-09-19T13:40:03.477 回答
0

我喜欢在构造函数中实例化任何对象。所以给定你的代码,我会在基类的默认构造函数中初始化它的“foo3”。

abstract class foo
{
     public foo() { this.my3rdFoo = new foo3(); }
     public string myId {get;set;}
     public string mystring {get;set;}
     public foo3 my3rdFoo {get;set}
}

class foo2 : foo
{
     public string myFavoriteFoo {get;set;}
}

class foo3
{
     public string myName{get;set}         
}
于 2013-09-19T13:48:33.280 回答
0

你的实例化应该是这样的

foo2 newDoc = new foo2();

newDoc.myId = "123";
newDoc.mystring = "Hey";

newDoc.my3rdFoo = new foo3(); //move this to a constructor foo() if you would like
newDoc.my3rdFoo.myName = "blah...blah...";

你不能这样做((foo2)newDoc).foo3.myName。相反,它需要newDoc.my3rdFoo.myName

因为foo3是一个类,而是一个可以设置其属性my3rdFoo的类的实例。foo3

于 2013-09-19T13:49:03.657 回答
0

您可以foo3在以下构造函数中实例化对象foo

abstract class foo
{
     public string myId {get;set;}
     public string mystring {get;set;}
     public foo3 my3rdFoo {get;set}
     public foo()
     {
          this.my3rdFoo = new foo3();
     }
}

像这样使用它:

foo newDoc = new foo2();
newDoc.my3rdFoo.myName = "blah...blah...";

并且您应该考虑将您的类和属性大写,以便符合C# 约定

于 2013-09-19T13:52:53.040 回答
0
abstract class foo
{
     public string myId {get;set;}
     public string mystring {get;set;}
     public foo3 my3rdFoo {get;set}
}

class foo2 : foo
{
     public string myFavoriteFoo {get;set;}
}

class foo3:foo2
{
     public string myName{get;set}         
}

使用实例化

Foo3 myThirdFoo = new foo3();
string result = foo3.myName;

如果您想从 foo2 内部访问第三个 foo ,请使用此代码

abstract class foo
{
     public string myId {get;set;}
     public string mystring {get;set;}
     public foo3 my3rdFoo {get;set}
}

class foo2 : foo
{
     public foo3 myFavoriteFoo {get;set;}
}

class foo3
{
     public string myName{get;set}         
}

并使用如下

foo3 ThirdFoo = new foo3();
ThirdFoo.myName = "Something nice";

foo2 SecondFoo = new foo2(){myFavouriteFoo = ThirdFoo};
String Result = SecondFoo.myFavouriteFoo.myName;

另一种方法是

 abstract class foo
    {
         public string myId {get;set;}
         public string mystring {get;set;}
         public foo3 my3rdFoo {get;set}
    }

    class foo2 : foo
    {
         public foo3 myFavoriteFoo {get;set;}

         public foo2(string myName)
         {
             foo3 = new foo3();
             foo3.myName = myName;

         }

    }

    class foo3
    {
         public string myName{get;set}         
    }

然后使用

foo2 SecondFoo = new foo2("Something nice");
String Result = SecondFoo.myfavouritefoo.myName;
于 2013-09-19T13:42:57.197 回答