C#继承重写一个参数
C# inheritance override a parameter
我有一个 "specific Manager" 继承了 "Manager",
我还有一个 "specific Object" 继承了 "BaseClass"
我尝试编码的是用 "Manager" 处理 "BaseClass" 属性,用 "specific Manager" 处理 "specific Object" 属性。
现在可能有点乱所以我有一个 Class UML :
这是代码的基础:
class Program
{
static void Main(string[] args)
{
SpecificManager ManagerFoo = new SpecificManager();
SpecificManager2 ManagerBar = new SpecificManager2();
}
}
public class Manager
{
public void Manage()
{
// deal with BaseClass properties of the SpecificObject
// myObject should be know as type of SpecificObject or SpecificObject2 depending of SpecificManager child
myObject.isAlive = true;
}
}
public class SpecificManager : Manager
{
public SpecificObject myObjectSpec = new SpecificObject("Alfred");
public void SpecificManage()
{
// Manage Attributes of SpecificObject class
myObjectSpec.level = 2;
base.Manage();
}
}
public class SpecificManager2 : Manager
{
public SpecificObject2 myObjectSpec = new SpecificObject2("Alfred2");
public void SpecificManage2()
{
// Manage Attributes of SpecificObject2 class
myObjectSpec.description = "Foo";
base.Manage();
}
}
public class BaseClass
{
public string gameObject;
public bool isAlive;
public BaseClass(string gameObjectStructure)
{
this.gameObject = gameObjectStructure;
}
}
public class SpecificObject : BaseClass
{
public int level = 1;
public SpecificObject(string objectname) : base(objectname)
{
}
}
public class SpecificObject2 : BaseClass
{
public string description = String.Empty;
public SpecificObject2(string objectname) : base(objectname)
{
}
}
也许我希望它的工作方式不是正确的方式,
所以我真的很高兴得到一些建议!
谢谢亲爱的帮手!
关于继承如何工作的具体问题的快速回答是,您可以将 public int 级别放入基础 class 对象(@Sriram Sakthivel 指出这不是一个好方法用于您的 class 的名称,因为它是 c# 中最基本的对象),然后两个子 classes 都可以使用它。所以你的代码至少会在那个时候编译和运行。
这看起来像下面这样(请注意,我已经将您的 class 名称从 Object 更改为 BaseClass,虽然比 Object 更好的名称仍然不能很好地描述 class 的作用所以我也不会使用)
public class BaseClass
{
public string gameObject;
public bool isAlive;
public int level;
public BaseClass(string gameObjectStructure)
{
this.gameObject = gameObjectStructure;
level = 1;
}
}
另一个建议是,您首先不要养成使用 public 成员的习惯,而是使用属性。这有几个好处,但主要的好处之一是您现在可以覆盖 属性 的设置方式。例如,如果 SpecificObject1 需要对 Level 做一些与 SpecifictObject2 不同的事情。
此更改如下所示...
public class BaseClass
{
private string gameObject;
private bool isAlive;
private int level;
public BaseClass(string gameObjectStructure)
{
this.gameObject = gameObjectStructure;
level = 1;
}
//don't include a set property to prevent anyone from changing the value
public string GameObject { get { return gameObject; } }
//"normal" property which includes a way to set and get the value
public bool IsAlive { get { return isAlive; } set { isAlive = value; } }
//Include virtual which allows the child classes to override the behavior
public virtual Level { get { return level; } set { level = value; } }
}
public SpecificObject : BaseClass
{
private string levelMessage;
public SpecificObject(string objectname) : base(objectname)
{
//No need to call base.gameObject = objectName; because that is what
//base(objectname) is doing for you.
levelMessage = String.Empty;
}
//Contrived example showing overrides on a virtual method.
public override Level
{
get { return base.Level }
set {
base.Level = value;
levelMessage = value.ToString();
}
}
}
您还可以做其他事情来改进您的代码,但这应该让您朝着正确的方向开始,并解释您最初关于继承的问题。
我可能已经找到解决办法了。
class Program
{
static void Main(string[] args)
{
SpecificManager specificManager = new SpecificManager();
SpecificManager2 specificManager2 = new SpecificManager2();
//...
specificManager.Manage();
specificManager2.Manage();
}
}
public class Manager
{
dynamic myObject = null;
public void ManagerInit (dynamic myObject)
{
this.myObject = myObject;
}
public void Manage()
{
if (myObject == null)
return;
// deal with BaseClass properties of the SpecificObject
myObject.isAlive = true;
}
}
public class SpecificManager : Manager
{
public SpecificObject myObjectSpec = new SpecificObject("Alfred");
public SpecificManager ()
{
base.ManagerInit(myObjectSpec);
}
public void SpecificManage()
{
// Manage Attributes of SpecificObject class
myObjectSpec.level = 2;
base.Manage();
}
}
public class SpecificManager2 : Manager
{
public SpecificObject2 myObjectSpec2 = new SpecificObject2("Alfred2");
public SpecificManager2 ()
{
base.ManagerInit(myObjectSpec2);
}
public void SpecificManage2()
{
// Manage Attributes of SpecificObject2 class
myObjectSpec2.description = "Foo";
base.Manage();
}
}
public class BaseClass
{
public string gameObject;
public bool isAlive;
public BaseClass(string gameObjectStructure)
{
this.gameObject = gameObjectStructure;
}
}
public class SpecificObject : BaseClass
{
public int level = 0;
public SpecificObject(string objectname) : base(objectname)
{
}
}
public class SpecificObject2 : BaseClass
{
public string description = String.Empty;
public SpecificObject2(string objectname) : base(objectname)
{
}
}
在管理器下完成的编译和更改在 SpecificManagers 下很明显。
可怕的是,如果我在 Manage 方法下写一些愚蠢的东西,代码不会在构建时大喊大叫...
我有一个 "specific Manager" 继承了 "Manager", 我还有一个 "specific Object" 继承了 "BaseClass"
我尝试编码的是用 "Manager" 处理 "BaseClass" 属性,用 "specific Manager" 处理 "specific Object" 属性。
现在可能有点乱所以我有一个 Class UML :
这是代码的基础:
class Program
{
static void Main(string[] args)
{
SpecificManager ManagerFoo = new SpecificManager();
SpecificManager2 ManagerBar = new SpecificManager2();
}
}
public class Manager
{
public void Manage()
{
// deal with BaseClass properties of the SpecificObject
// myObject should be know as type of SpecificObject or SpecificObject2 depending of SpecificManager child
myObject.isAlive = true;
}
}
public class SpecificManager : Manager
{
public SpecificObject myObjectSpec = new SpecificObject("Alfred");
public void SpecificManage()
{
// Manage Attributes of SpecificObject class
myObjectSpec.level = 2;
base.Manage();
}
}
public class SpecificManager2 : Manager
{
public SpecificObject2 myObjectSpec = new SpecificObject2("Alfred2");
public void SpecificManage2()
{
// Manage Attributes of SpecificObject2 class
myObjectSpec.description = "Foo";
base.Manage();
}
}
public class BaseClass
{
public string gameObject;
public bool isAlive;
public BaseClass(string gameObjectStructure)
{
this.gameObject = gameObjectStructure;
}
}
public class SpecificObject : BaseClass
{
public int level = 1;
public SpecificObject(string objectname) : base(objectname)
{
}
}
public class SpecificObject2 : BaseClass
{
public string description = String.Empty;
public SpecificObject2(string objectname) : base(objectname)
{
}
}
也许我希望它的工作方式不是正确的方式, 所以我真的很高兴得到一些建议!
谢谢亲爱的帮手!
关于继承如何工作的具体问题的快速回答是,您可以将 public int 级别放入基础 class 对象(@Sriram Sakthivel 指出这不是一个好方法用于您的 class 的名称,因为它是 c# 中最基本的对象),然后两个子 classes 都可以使用它。所以你的代码至少会在那个时候编译和运行。
这看起来像下面这样(请注意,我已经将您的 class 名称从 Object 更改为 BaseClass,虽然比 Object 更好的名称仍然不能很好地描述 class 的作用所以我也不会使用)
public class BaseClass
{
public string gameObject;
public bool isAlive;
public int level;
public BaseClass(string gameObjectStructure)
{
this.gameObject = gameObjectStructure;
level = 1;
}
}
另一个建议是,您首先不要养成使用 public 成员的习惯,而是使用属性。这有几个好处,但主要的好处之一是您现在可以覆盖 属性 的设置方式。例如,如果 SpecificObject1 需要对 Level 做一些与 SpecifictObject2 不同的事情。
此更改如下所示...
public class BaseClass
{
private string gameObject;
private bool isAlive;
private int level;
public BaseClass(string gameObjectStructure)
{
this.gameObject = gameObjectStructure;
level = 1;
}
//don't include a set property to prevent anyone from changing the value
public string GameObject { get { return gameObject; } }
//"normal" property which includes a way to set and get the value
public bool IsAlive { get { return isAlive; } set { isAlive = value; } }
//Include virtual which allows the child classes to override the behavior
public virtual Level { get { return level; } set { level = value; } }
}
public SpecificObject : BaseClass
{
private string levelMessage;
public SpecificObject(string objectname) : base(objectname)
{
//No need to call base.gameObject = objectName; because that is what
//base(objectname) is doing for you.
levelMessage = String.Empty;
}
//Contrived example showing overrides on a virtual method.
public override Level
{
get { return base.Level }
set {
base.Level = value;
levelMessage = value.ToString();
}
}
}
您还可以做其他事情来改进您的代码,但这应该让您朝着正确的方向开始,并解释您最初关于继承的问题。
我可能已经找到解决办法了。
class Program
{
static void Main(string[] args)
{
SpecificManager specificManager = new SpecificManager();
SpecificManager2 specificManager2 = new SpecificManager2();
//...
specificManager.Manage();
specificManager2.Manage();
}
}
public class Manager
{
dynamic myObject = null;
public void ManagerInit (dynamic myObject)
{
this.myObject = myObject;
}
public void Manage()
{
if (myObject == null)
return;
// deal with BaseClass properties of the SpecificObject
myObject.isAlive = true;
}
}
public class SpecificManager : Manager
{
public SpecificObject myObjectSpec = new SpecificObject("Alfred");
public SpecificManager ()
{
base.ManagerInit(myObjectSpec);
}
public void SpecificManage()
{
// Manage Attributes of SpecificObject class
myObjectSpec.level = 2;
base.Manage();
}
}
public class SpecificManager2 : Manager
{
public SpecificObject2 myObjectSpec2 = new SpecificObject2("Alfred2");
public SpecificManager2 ()
{
base.ManagerInit(myObjectSpec2);
}
public void SpecificManage2()
{
// Manage Attributes of SpecificObject2 class
myObjectSpec2.description = "Foo";
base.Manage();
}
}
public class BaseClass
{
public string gameObject;
public bool isAlive;
public BaseClass(string gameObjectStructure)
{
this.gameObject = gameObjectStructure;
}
}
public class SpecificObject : BaseClass
{
public int level = 0;
public SpecificObject(string objectname) : base(objectname)
{
}
}
public class SpecificObject2 : BaseClass
{
public string description = String.Empty;
public SpecificObject2(string objectname) : base(objectname)
{
}
}
在管理器下完成的编译和更改在 SpecificManagers 下很明显。 可怕的是,如果我在 Manage 方法下写一些愚蠢的东西,代码不会在构建时大喊大叫...